Hdoj-1563-Find your present!

题目: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;
}

直接暴力即可。

你可能感兴趣的:(Hdoj-1563-Find your present!)