hdoj-2095-find your present (2)【位异或】

find your present (2)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 18431 Accepted Submission(s): 7101

Problem Description

In the new year party, everybody will get a "special present".Now it‘s your turn to get your special present, a lot of presents now putting on the desk, and only one of them will be yours.Each present has a card number on it, and
your present‘s card number will be the one that different from all the others, andyou can assume that only one number appear odd times.For example, there are 5 present,
and their card numbers are 1, 2, 3, 2, 1.so your present will be the one with the card number of 3, because 3 is the number that different from all the others.

Input

The input file will consist of several cases.

Each case will be presented by an integer n (1<=n<1000000, and n is odd) at first. Following that, n positive integers will be given in a line, all integers will smaller than 2^31. These numbers indicate the card numbers of the presents.n = 0 ends the input.

Output

For each case, output an integer in a line, which is the card number of your present.

Sample Input

5
1 1 3 2 2
3
1 2 1
0

Sample Output

3
2

Hint

Hint

use scanf to avoid Time Limit Exceeded

Author

8600

Source

HDU 2007-Spring Programming Contest - Warm Up (1)

Recommend

8600 | We have carefully selected several similar problems for you:2094
1597 1593 1595 1599

本来以为这种方法一定会超时,没想到能过,可见:位运算效率还是挺高的

  Exe.Time Exe.Memory Code Len.    
  889MS 5324K 506 B      
#include<stdio.h>
#include<algorithm>
using namespace  std;
int a[1000010];
int main(){
    int n;
    while(scanf("%d",&n),n){
        int i,k;
        for(i=0;i<n;++i){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        k=0;
        int ok=0;
        for(i=1;i<n;++i){
            if(a[i]^a[k]){
                //printf("%d,%d\n",a[i],a[k]);
                //printf("i-k=%d\n",i-k);
                if((i-k)&1){
                    ok=1;
                    printf("%d\n",a[k]);
                    break;
                }
                else{
                    k=i;
                }
            }
        }
        if(!ok) printf("%d\n",a[n-1]);

    }
    return 0;
}

最初没想到可以直接用异或处理, 因为其他的卡片个数都是偶数,任意两个相同的数字进行异或后都是0,而异或满足交换律,运算次序无关,结果相同

Exe.Time

Exe.Memory Code Len.    
748MS 1404K 187B      

#include<stdio.h>
int main(){
    int n;
    while(scanf("%d",&n),n){
        int a,i,res=0;
        for(i=0;i<n;++i){
            scanf("%d",&a);
            res=res^a;
        }
        printf("%d\n",res);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-14 13:13:04

hdoj-2095-find your present (2)【位异或】的相关文章

hdoj 2095 find your present (2) 【位运算】

题意:找出现次数不同于其他数的数. 超时了一次,后来知道了位运算...长见识了 0^0 =0 0^1=1 1^0=1 1^1=0 0^1^1 = 0 可以发现 任何数异或0还是他本身. 一个数异或另一个数偶数次还是他本身. 代码(位运算都600+ms): #include <stdio.h> #include <math.h> int main() { int a, b, n; while(scanf("%d", &n), n){ scanf("

hdu 2095 find your present(2)

find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 5186 Accepted Submission(s): 1513   Problem Description In the new year party, everybody will get a "special present".Now

杭电acm 2095 find your present (2)

#include<iostream>using namespace std;int main(){    int n,x,y;    while(cin>>n,n)    {         cin>>x;                   while(--n)         {             cin>>y;             x=x^y;         }         cout<<x<<"\n&q

hdu 2095 find your present (2) 找到只出现一次的数字

find your present (2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 15349    Accepted Submission(s): 5821 Problem Description In the new year party, everybody will get a "special present"

杭电 2095 find your present (2)【位运算 异或】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2095 解题思路:因为只有我们要求的那个数出现的次数为奇数,所以可以用位运算来做,两次异或同一个数最后结果不变,那么就可以知道异或运算相当于过滤掉了出现次数为偶数的数,最后只留下了唯一的那一个出现次数为奇数的数. 反思:位运算好陌生,好好学. #include<stdio.h> int main() { int n; long int a; while(scanf("%d",&a

HDU 2095 find your present(异或)

题意 求一组数中只出现过奇数次的数  输入保证只有一个数满足 知道一个数与自己的异或等于0  与0的异或等于自己就行咯 #include<cstdio> using namespace std; int main() { int n, t, ans; while(scanf("%d", &n), n) { ans = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &t); ans = an

(HDUSTEP 2) hdu 2095 find your present (2)(找到出现奇数次的那个数)

题目如下: find your present (2) Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/1024 K (Java/Others) Total Submission(s): 6275 Accepted Submission(s): 1639   Problem Description In the new year party, everybody will get a "special present"

hdu 2095 find your present (2)

题意:给n个正整数,并保证只有一个数是与众不同的,要你找出与众不同的数. 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1000005]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=0; i<n; i++) scanf(&qu

HDU 2095 find your present (2) 异或

异或 暴力开数组,然而明显不过,要求32768k,结果超时了 #include <cstdio> #include <cstring> int book[1000000]; int main() { int n; while (scanf("%d", &n) && n) { int a; memset(book, 0, sizeof(book)); for (int i = 0; i < n; i++) { scanf("

HDOJ(HDU) 1563 Find your present!(异或)

Problem Description In the new year party, everybody will get a "special present".Now it's your turn to get your special present, a lot of presents now putting on the desk, and only one of them will be yours.Each present has a card number on it,