牛的选举
总时间限制:
1000ms
内存限制:
65536kB
描述
现在有N(1<=N<=50000)头牛在选举它们的总统,选举包括两轮:第一轮投票选举出票数最多的K(1<=K<=N)头牛进入第二轮;第二轮对K头牛重新投票,票数最多的牛当选为总统。
现在给出每头牛i在第一轮期望获得的票数Ai(1<=Ai<=1,000,000,000),以及在第二轮中(假设它进入第二轮)期望获得的票数Bi(1<=Bi<=1,000,000,000),请你预测一下哪头牛将当选总统。幸运的是,每轮投票都不会出现票数相同的情况。
输入
第1行:N和K
第2至N+1行:第i+1行包括两个数字:Ai和Bi
输出
当选总统的牛的编号(牛的编号从1开始)
样例输入
5 3 3 10 9 2 5 6 8 4 6 5
样例输出
5
思路:
大家都看的出来,这是一道排序题目,需要将第一轮投票数的排序(记住是从大到小“题目要求”),然后选出后面n-k个牛,将其的票数清零(因为第二轮还需要排序),然后在根据第二轮的投票数进行排序(自然还是从大到小),选其中最大的数的编号来做总统。
我们如果用普通的排序,是不能通过第二轮找到的最大数来找到这头牛的编号(如果你枚举来判断的话,是可以的“不会出现票数相同的情况”,但是会用掉O(n)的时间),所以我们可以来写一个结构,结构里面要有什么呢?
我们来看题目,有ai和bi还有没头牛的编号,表明这个结构有3个元素,ai第一轮投票得数,bi第二轮得票数,最后一个i是当前牛的编号,我们可以将ai和bi设置为数组,也可以定义一个结构变量数组(两者都可以的),然后每次输入ai、bi、i,之后进行第一轮的排序,这个排序应该怎么排呢?是自己手写一个排序函数,还是用STL库中的sort呢?
根据我个人建议,用sort函数进行两次排序,是不会超标的,那我们应该怎样用sort函数呢?在sort函数原型中,sort函数是有3个参数的,第3个参数可有可无,在这次结构排序中,就需要用到第3个参数。
这第3个参数是可以加一个函数的,这个函数有两个参数,都是需要排序的结构变量,首先要说明是从大到小排序还是从小到大排序,然后再说明将这个结构里面的哪个变量进行排序。就比如说这道题,先要说明一下是从大到小(从小到大也是可以的)排序,然后继续说明是ai来比较,最后就是返回参数1.ai<参数2.ai。
因为这道题我们要进行两次排序,而且每次排序的结构参数都是不一样的,一个是ai,一个是bi,所以我们要写两个函数。
经过第一次排序之后,我们需要将没有晋级的牛的ai、bi两个参量设置为0,因为还需要排序,然后进行第二轮排序,经过两次排序之后,排在结构变量数组[0]的是在第一轮晋级,第二轮投票数最高的,所以它就是牛的总统,我们只需要输出结构变量数组[0].i+1(因为i我是从0开始存的,而题目要求是从1开始的,所以我要加1)就行了。
牛的选举代码(sort就是冒泡排序):
#include<bits/stdc++.h>
using namespace std;
struct cow{
int ai;
int bi;
int i;
};
int cmp1(cow a,cow b){
return a.ai>b.ai;
}
int cmp2(cow a,cow b){
return a.bi>b.bi;
}
int main(){
int n,k;
cin>>n>>k;
cow a[n];
for(int i=0;i<n;i++) cin>>a[i].ai>>a[i].bi,a[i].i=i;
sort(a,a+n,cmp1);
for(int i=k;i<n;i++) a[i].ai=0,a[i].bi=0;
sort(a,a+n,cmp2);
cout<<a[0].i+1<<endl;
return 0;
}
最近在做排序的题,所以会发一些关于排序的文章!
题目链接: