hdu 1029
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1029相关的知识,希望对你有一定的参考价值。
题意是统计输入n(奇数)个数字,输出数量大于等于(n+1)/2的数字。
这个数字的最少为(n+1)/2个,也就是最少比其余数字多一。所以用计数器cnt来记录出现的次数,最后最多的就是所求数。
#include<cstdio>
using namespace std;
int main(){
int n,num,cnt,result;
while(~scanf("%d",&n)){
cnt=0;
while(n--){
scanf("%d",&num);
if(cnt==0){
cnt=1;
result=num;
}
if(cnt!=0){
if(result==num)
cnt++;
else
cnt--;
}
}
printf("%d\n",result);
}
return 0;
}
一开始的代码是这样的,看了半天没发现错误,但是中间的两个if对一次数据执行了两次。
改正后:
#include<cstdio>
using namespace std;
int main(){
int n,num,cnt,result;
while(~scanf("%d",&n)){
cnt=0;
while(n--){
scanf("%d",&num);
if(cnt==0){
cnt=1;
result=num;
}
else{
if(result==num)
cnt++;
else
cnt--;
}
}
printf("%d\n",result);
}
return 0;
}
另一个思路就是排序输出中数:
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int a[1000002],n;
while(~scanf("%d",&n)){
while(n--){
scanf("%d",&a[n]);
printf("%d\n",n);
}
sort(a+1,a+n+1);
printf("%d\n",a[(n)/2]);
}
return 0;
}
这个代码和网上的文章差不多,刚开始超时了,以为这个方法不可以,结果拿别人的文章去试了试,发现是我的错了(话说谁会把不过的方法发出来啊……)
1.数据数量在while 里直接被改动了。所以后面的sort调用会出错。
2.while里的n--直接执行,而不是主语句里的内容执行完后才减1,所以范围依旧是a,a+1。
3.中间数的问题,1~n的中间数为(n+1)/2,但是下标从0开始,也就是说n为奇数,但是长度为偶数n+1,此时中间数为(n-1)/2,感觉还是举例子验算为好。
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int a[1000002],n;
while(~scanf("%d",&n)){
int i=n;
while(n--){
scanf("%d",&a[n]);
}
sort(a,a+i);
printf("%d\n",a[(i-1)/2]);
}
return 0;
}
以上是关于hdu 1029的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1029 Ignatius and the Princess IV --- 水题