hdu 1029 Ignatius and the Princess IV

acm题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=1029]
看到这道题,首先就想到用数组,用一个count数组计数,然后输出下标。但是,想一下假如测试的数字非常大,这样再用数组来存是非常占用空间的,再者题目并没用明说这个题测试当中具体最大整数的界限(比如:有N(11)个整数,那么这11个整数当中最大的整数是什么,有可能是1,也有可能是1000,因此要用多大的一个计数的数组呢?) 当然我也不知道,只是用9996这个范围大小的数组来计数倒是刚好ac了
附上ac代码

#include<stdio.h>
#include<string.h>
int count[9996];//这个数组用来计数 
int main()
{
    int N,i,num;
    while(scanf("%d",&N)!=EOF)
    {
        memset(count,0,sizeof(count));//对数组初始化
        for(i=0;i<N;i++)
        {
            scanf("%d",&num);
            count[num]++;//让相应的下标来实现计数  
        }   
        for(i=0;;i++)
        {
            if(count[i]>=(N+1)/2)
            {
                printf("%d\n",i);//此处应输出下标 
                break;
            }       
        } 
    } 
    return 0;
}

(ps:我尝试了一下9986就通不过)
不可否认,用这种方式有投机取巧的“嫌疑”吧,刚好卡到了系统测试的数据那里。再者,这样也是比较浪费空间的。
换一种方法,观察一下下面的测试用例,试想一下N个数(奇)且要求至少有(N+1)/2个要找的特殊的数,假如说,现在有N=5个整数,分别是1 3 2 3 3让count=0从头开始,先是1且count变为1,然后第一个数1与第二数3比较发现不等就让count–,否则count++,以此类推,且要用flag来记录当前序列中那个特殊的数。
附上ac代码

#include<stdio.h>
int main()
{
    int i,N,count,num,flag;
    while(scanf("%d",&N)!=EOF)
    {
        count=0;
        for(i=0;i<N;i++)
        {
            scanf("%d",&num);
            if(count==0)
            {
                flag=num;
                count=1;
            } 
            else
            {
                if(flag==num)
                    count++;
                else
                    count--;
            } 
        }
        printf("%d\n",flag);
    }
    return 0;
}

在此声明,这些代码网上也都有,不可否认,当自己不会的时候就去看看别人的。雷同是不可避免,至少我的水平比较low,好多是让大神教的或者看网上的,但我仍然坚持写出来,就是希望这样可以监督自己学习,在刷这些题目时不至于某一天自己坚持不下来了。^^

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值