牛的选举

牛的选举

总时间限制: 

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;
}

  最近在做排序的题,所以会发一些关于排序的文章!

题目链接:

OpenJudge - 3:牛的选举http://dsalgo.openjudge.cn/sort/3/ 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值