CF1267E Elections
题目描述
有n(n<=100)个人,m(m<=100)个投票站,每个投票站对每个人都有一定的票数(<=1000).
第n个是坏蛋,请问去除掉哪几个投票站才能使他的票数严格小于其他每个人中的一个,也就是不能让第n个人的总票数最多。
输入格式
第一行是两个整数,分别是n和m.
接下来m行n列,代表每个投票站对这n个人的票数。
输出格式
第一行一个整数k,代表需要去掉几个投票站。
第二行有k个数,代表投票站的号数,不要求字典序.
贪心
问的是去除那几个投票站.
思路
先对每个人进行处理,使用一个结构体,存下每个投票站给他的票数和给第n个人的票数的差和投票站编号.在进行排序,差值从小到大,在倒序判断,加上当前的差值后总差值是否小于0,因为就算当前总差值小于0也可能在之后变为正,所以需要排序之后从大到小求和,如果当前已经为负了,就可以考虑去除这个投票站。因为只要有任意一个严格大于第n个就行了,所以取这n-1个人中需要去掉投票站最少的一个。此处可以用vector维护.
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll N=105;
int n,m;
struct node{
int a;
int b;
}brr[N];
bool comp(node x, node y){
return x.a<y.a;
}
int arr[N][N];
vector<int> boy[N];
int main() {
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
scanf("%d",&arr[i][j]);
for (int i=0;i<n-1;i++){
for (int j=0;j<m;j++){
brr[j].a=arr[j][i]-arr[j][n-1];
brr[j].b=j;
}
sort(brr,brr+m,comp);
int val=0;
for ( int j=m-1;j>=0;j--)
if (val+brr[j].a>=0)
val+=brr[j].a;
else
boy[i].push_back(brr[j].b);
}
int min=0;
for(int i=0;i<n-1;i++)
min=boy[i].size()<boy[min].size()?i:min;
printf("%d\n",boy[min].size());
for(int i=0;i<boy[min].size();i++)
printf("%d ",boy[min][i]+1);
printf("\n");
}
作者:${\color{Violet}かの}$
-----若转载请附原作者名及原文链接-----
-----若转载请附原作者名及原文链接-----
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 智能Agent如何改造传统工作流:从搜索到全能助手