您的位置:首页 > 其它

Hdoj-1563-Find your present!

2016-04-08 13:06 441 查看
题目:Find your present!

本题有多种做法。我刚刚开始所选用的方法略为暴力,定义一个数组,直接在输入编号的过程中,把其对应数组下标的数组元素++。

解法1:(Runtime Error)

#include<stdio.h>
#include<string.h>
int a[1005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
int b;
memset(a,0,sizeof(a));
while(n--)
{
scanf("%d",&b);
a[b]++;
}
int i;
for(i=1;i<1000;i++)
{
if(a[i]%2!=0)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}


开的数组太小,而编号又可能是大整数(但不超过int范围)。得到这样的结果也是早有预料。

看了下Discuss,发现高手们的解法非常值得学习和体会。贴两种方法:

解法2:(accept)

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(cin>>n&&n){
int a[2000],i;
for(i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(i=1;i<n;i++)
if(a[i]!=a[i-1]&&a[i]!=a[i+1]){
cout<<a[i]<<endl;
break;
}
}
}


做法是简单的sort排序,然后遍历一遍数组元素,找到既与前面的元素不同,又与后面元素不同的数组元素,就是我们要的答案了。

Discuss也有人用这样的算法,但是还是对两个端点进行了判断。用上面这个条件判断即可。

解法3:(accept)

在输入的时候判断最大的那个数,输出即可。

解法4:(accept)

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
int n,j,a[201],b[201];
while((cin>>n)&&n)
{
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
cin>>a[i];
for(j=0;j<i;j++)
if(a[j]==a[i])
{
b[j]++;
break;
}
if(j==i)
b[i]++;
}
for(int i=0;i<n;i++)
if(b[i]==1)
{
cout<<a[i]<<endl;
break;
}
}
return 0;
}


直接暴力即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: