雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

发帖水王的加强版

Posted on 2013-12-28 21:07  huhuuu  阅读(308)  评论(0编辑  收藏  举报

  发帖水王:一堆数中有一个数字出现的次数多于1/2,问那个数?

  比较简单的思路就是两个变量,一个记录当前的数字a,另一个记录当前数字出现的次数size,下一个数字与a相同的时候,size++,不同的时候:size>1,则size--;否则更新a,size=1;

  

  加强版:一堆数中有3个数字出现的次数多于1/4,问是哪三个数?

  思维迁移,用3个{a,size}量保存当前更新的数,下一个数字的时候,看这三个里面是否有这个数字存在,若是,则相应的size++;否则,找出sizez最小的那个量,size>1,则size--;否则更新a,size=1;

  

#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;

struct data{
    int a;
    int size;
}s[3];

int main(){
    int n,i,temp,j;

    for(i=0;i<3;i++){
        s[i].a=0;
        s[i].size=0;
    }
    scanf("%d",&n);

    for(i=1;i<=n;i++){
        scanf("%d",&temp);

        bool same=0;
        int sj,min=99999999;
        for(j=0;j<3;j++){
            if(s[j].a==temp){
                same=1;
                sj=j;
                break;
            }
            if(min>s[j].size){
                min=s[j].size;
                sj=j;
            }
        }

        if(same==1){
            s[sj].size++;
        }else{
            if(s[sj].size==0){
                s[sj].size=1;
                s[sj].a=temp;
            }else{
                s[sj].size--;
            }
        }
    }

    for(i=0;i<=2;i++){
        printf("%d\n",s[i].a);
    }


    getchar();
    getchar();
    return 0;
}
View Code