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

猜你喜欢

转载自blog.51cto.com/13688928/2103704