zoukankan      html  css  js  c++  java
  • nyoj528-找球号(三) 【位运算】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=528

    找球号(三)

    时间限制:2000 ms  |  内存限制:3000 KB
    难度:2
     
    描述

    xiaod现在正在某个球场负责网球的管理工作。为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数。有一天,xiaod发现少了一个球,你能帮他找出丢的那个球的球号吗?

    输入
    有多组测试数据。每组数据包括两行。
    第一行是一个整数N(0<N<1000000),表示现在所剩的球数。
    随后的一行是N个数,表示所剩的各个球的编号M(0<M<10^9)。
    输出
    对于每组数据,输出弄丢的那个球的球号。
    样例输入
    5
    1 1 3 6 6
    3
    1 2 1
    样例输出
    3
    2


    解题思路A:最直接的思路,排序,挨个检查。
    代码未通过MLE了:
     1  
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <set>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 
    10 int am[1000005];
    11 int m;
    12 
    13 int main(){
    14     while(~scanf("%d",&m)){
    15         for(int i=0;i<m;i++){
    16             scanf("%d",&am[i]);
    17         }
    18         sort(am,am+m);
    19         int t;
    20         bool b=false;
    21         for(int i=0;i<m;i++){
    22             if(!b)  t=am[i],b=true;
    23             else if(t==am[i]){
    24                 b=false;
    25             }else{
    26                 printf("%d
    ",t);
    27                 goto tt;
    28             }
    29         }
    30         printf("%d
    ",t);
    31         tt:;
    32     }
    33     return 0;
    34 }
    35         
    View Code

    解题思路B:利用set,每查相同即erase,减少内存占用。

    代码AC:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <set>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 int main(){
    10     int m,t;
    11     set<int> se;
    12     set<int>::iterator it;
    13     while(~scanf("%d",&m)){
    14         for(int i=0;i<m;i++){
    15             scanf("%d",&t);
    16             it=se.find(t);
    17             if(it!=se.end()){
    18                 se.erase(it);
    19             }else{
    20                 se.insert(t);
    21             }
    22         }
    23         it=se.begin();
    24         printf("%d
    ",*it);
    25         se.erase(se.begin());
    26     }
    27     return 0;
    28 }
    29         
    View Code

    解题思路C:stl有个缺点,就是效率较低,有部分无用内存。这道题有意思的地方是,可以把所有数据直接进行异或,奇数那个编号在异或后会显示出来(偶数的都抵消了)。

    代码AC:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <set>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 int main(){
    10     int m,t,ans;
    11     while(~scanf("%d",&m)){
    12         ans=0;
    13         for(int i=0;i<m;i++){
    14             scanf("%d",&t);
    15             ans^=t;
    16         }
    17         printf("%d
    ",ans);
    18     }
    19     return 0;
    20 }
    21         
    View Code
  • 相关阅读:
    函数节流
    ios12兼容性问题,调用原生接口,判断系统为ios12
    谷歌浏览器跨域
    超过两行...,只有两行或少于两行无...且没有查看更多文字 关键思路:超过两行...用ellipsis,但是为了判断文字是否多余两行,所以要获取节点的高度,如果大于两行则文字出现,否则没有更多文字
    Object.assign 浅拷贝还是深拷贝
    用instanceof判断数组类型
    322.零钱兑换(动态规划和贪心)
    面试题59
    tcp四次挥手
    tcp连接的三次握手
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4304569.html
Copyright © 2011-2022 走看看