题目链接
水题,这里不多说什么,在代码的注释里写得很详细了。
#include <iostream> #include <algorithm> using namespace std; float a[100]; //数组大小问题:一开始用30不知为何RE了,改用100直接AC float b[100];//用于排序寻找第K小数 int c[100]; //用于存储最后输出的序号 bool cmp(const int &a,const int &b) //升序排列 { return a > b; } int main() { int N,M,K,i,j,curr; float temp,min; while(cin>>N>>M>>K) { memset(a,0,sizeof(a)); //初始化数组 memset(c,0,sizeof(c)); for(i=0;i<N;i++) { for(j=0;j<M;j++) { cin>>temp; a[j]+=temp; //计算每个选项投票总和 } } memcpy(b,a,M*sizeof(float)); //将a中元素全部移动到b中排序 sort(b,b+M,cmp); //投票从大到小排序 min=b[K-1]; //选出第K小投票数,若没有大于等于该数均不取 for(j=0,curr=0;j<M;j++) if(a[j]>=min){ c[curr++]=j+1;} //将对应序号存入c中 if(curr>K) //比如第二组数据有3个数满足条件,而curr=3,K=2.所以应从前面开始取 curr=K; //即输出应该为 2 1 而不是 3 2 所以令curr=K for(j=1;j<K;j++) cout<<c[--curr]<<" "; cout<<c[0]<<endl; } return 0; }