题意:有n个人参加选举,m个投票点,每个投票点都有一些对n个的选票,现在你不希望第n个人选举成功(选举成功的条件是他的选票比任何人都要多),问你最少摧毁多少个投票点可以达到目的;
枚举让第1个人选票大于等于第n个人最少需要摧毁多少…第n-1个人选票大于第n个人最少需要摧毁多少;
怎么求最少摧毁多少,用第j个投票点对第i个人的选票减去第n个人的值,升序排序,然后从前往后取主要仍然是大于0的这个投票点都可以取
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 105;
int n,m,mi = inf;
int a[N][N];
vector<int> ans;
vector<int> tmp;
struct Node{
int val,id;
}sta[N];
bool cmp(Node a,Node b){
return a.val > b.val;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i = 1;i <= n-1;i++){
tmp.clear();
for(int j = 1;j <= m;j++){
sta[j].val = a[j][i]-a[j][n];
sta[j].id = j;
}
sort(sta+1,sta+1+m,cmp);
int sum = 0;
for(int j = 1;j <= m;j++){
if(sum+sta[j].val >= 0) sum+=sta[j].val;
else tmp.push_back(sta[j].id);
}
if(tmp.size() < mi){
ans = tmp;
mi = tmp.size();
}
}
printf("%d\n",mi);
for(int i = 0;i < ans.size();i++){
printf("%d ",ans[i]);
}
return 0;
}