1139: 松哥的困惑V
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 471 Solved: 147
[Submit][Status][Web Board]Description
松哥上了数学课之后,觉得自己智力实在有所不足,所以他决定找人辩论,以提高自己的智力,已知松哥目前的智力是m,他决定和n个人辩论,如果他对手的智力高于他,松哥的智力能够提升2,否则只能提升1,假设松哥能够取得所有的胜利,请问他完成n场辩论后能够得到的最高智力是多少?
Input
多组测试数据.
每组测试数据的第一行包含两个正整数m,n.(m<=100,n<=10^5)
第二行为n个不大于100的整数,代表与他辩论人的智力.
Output
对于每组测试数据,他完成n场辩论后,能取得的最大的智力.
Sample Input
91 5 88 90 92 94 98
Sample Output
99
【简化题意】
1.先把n个人的智力分成 >m的 和 <= m的两堆,那么智力<= m的那堆就是注定让m+1的啦~(松哥智力m是越小越好~所以+1的部分最后加,先去进行比较让有可能+2的先加)
2.智力>m的那堆小到大排序,用m去比较,注意:这里m改变后重新分出来的一些 智力 <= m 的直接和前面<=m的那堆分在一起放到最后+1
#include <cstdio>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
int main()
{
int n,m,num;
while(scanf("%d%d",&m,&n) != EOF)
{
mem(a,0);
int t = 0,cnt_small = 0;
for(int i = 0;i < n;i ++)
{
scanf("%d",&num);
if(num <= m) cnt_small++;
else{
a[t++] = num;
}
}
sort(a,a+t);//这里是+t!!!!!不是n,天知道我找了多久错...
for(int i = 0; i < t;i ++)
{
if(a[i] > m)
m += 2;
else
cnt_small ++;
}
printf("%d\n",m+cnt_small);
}
return 0;
}