Hdoj-1563-Find your present!

来源:互联网 发布:移动宽带端口扩容申请 编辑:程序博客网 时间:2024/06/05 05:25

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

直接暴力即可。

0 0
原创粉丝点击