问题描述
"好吧,你是不是太糟糕了,他们。。。但你永远无法通过下一个测试。
"我会告诉你一个奇怪的数字N,然后N整
数。在他们中间会有一个特殊的整数,你必须告诉我,在我告诉你所有的整数后,哪个整数是特别的。
"但是,特殊整数的特点
是什么?伊格纳修斯问道。
"整数将至少出现(N+1)/2
次。如果你找不到合适的整数,我会杀了公主,你也是我的晚餐。哈哈哈哈。。。"冯5166说。
你能找到伊格纳修斯的特殊整数
吗?
输入
输入包含几个测试案例。每个测试案例包含两行。第一行由一个奇怪的整数N(1<=N<=99999)组成,表示整数冯5166将告诉我们的英雄的数量。第二行包含 N 整数。输入在文件末尾终止。
输出
对于每个测试案例,您只需要输出一行,其中包含您找到的特殊编号。
示例输入
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
样本输出
3
5
1
大意:就是输出数字出现超过(N+1)/2次的那位数
(#`O′)
个人理解变化历程:既然要超过超过(N+1)/2那么就一定是最多次!(超内存了啊)→决定舍去结构体用数组的下标=数字的值、数组的值=数字出现的次数→题目强调n是奇数
level 1:暴力计数,记完后遍历出大于(N+1)/2次的数并输出
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int N=1e7+5;//1*10^7+5
using namespace std;
struct node
{
int num,coun=0;
}node[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
int t,k=0,z;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
z=1;
for(int j=1;j<i;j++)
{
if(t==node[j].num)
{
node[j].coun++;
z=0;
break;
}
}
if(z)
{
k++;
node[k].num=t;
node[k].coun++;
}
}
int temp=1;
for(int i=1;i<=k;i++)
{
if(node[i].coun>=(n+1)/2)
temp=i;
}
printf("%d\n",node[temp].num);
}
return 0;
}
level2:代码篇幅明显少了不少,边输入边记数边判断,输入完就直接输出标记
#include<cstdio>
#include<cstring>
const int N=1e6;//1*10^6
int a[N];
int main()
{
int n,t,temp;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
a[t]++;
if(a[t]>=(1+n)/2)
temp=t;
}
printf("%d\n",temp);
}
return 0;
}
leve3:运用了函数,此时还没考虑到算法,sort排序后输出最中间的那个数字
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6;//1*10^6
int a[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
printf("%d\n",a[(n+1)/2]);//n是奇数需要+1
}
return 0;
}
leve 4:简单dp,注意数字出现超过(N+1)/2次!那么出现的次数减去所有其他数字出现的次数一定大于0!num再次归零时证明当前记录的数字不满足>(n+1)/2,重新假设下一数值为答案,以此遍历可得num!=0时的数字即结果
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,ans;
while(~scanf("%d",&n))
{
int num=0,a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
if(num==0)
{
ans=a;
num++;
}
else
{
if(a==ans)
num++;
else
num--;
}
}
printf("%d\n",ans);
}
return 0;
}