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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章