NYOJ 题目528 找球号(三)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 题目528 找球号(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
找球號(三)
時間限制:2000?ms ?|? 內存限制:3000?KB 難度:2 描述xiaod現在正在某個球場負責網球的管理工作。為了方便管理,他把每個球都編了號,且每個編號的球的總個數都是偶數。有一天,xiaod發現少了一個球,你能幫他找出丟的那個球的球號嗎?
輸入第一行是一個整數N(0<N<1000000),表示現在所剩的球數。
隨后的一行是N個數,表示所剩的各個球的編號M(0<M<10^9)。
樣例輸出
3 2 ? ? ? 一開始沒有注意內存限制,直接開了一個數組,用數組下標記錄球號,最后查詢時用a[i]對2取余,余數為1時,輸出 i 即可。提交以后才發現超內存了。超內存的代碼:
#include<stdio.h> #include<string.h> int a[1000002]; int main() {int n,i,m,max;while(~scanf("%d",&n)){memset(a,0,sizeof(a));max=0;for(i=0;i<n;i++){scanf("%d",&m);a[m]++;if(m>max)max=m;}for(i=1;i<=max;i++)if(a[i]&1){printf("%d\n",i);break;}}return 0; }后來聽人說可以用異或的性質來處理,就查了一下異或的性質,寫好代碼提交上就AC了。
異或的運算規則: 0^0=0, 0^1=1,1^0=1,1^1=0
具體就是先將十進制數轉化為二進制數(取8位或16位,不足補0),然后每一位對應異或運算,把結果轉化為十進制數就是異或后的結果。如9^5=12;
00001001 ?(9的二進制表示)
00000101 ? (5的二進制表示)
00001100 ? (異或后的結果,用十進制表示就是12)
具體代碼如下:
#include<stdio.h> int main() {int n,m,i,s;while(~scanf("%d",&n)){s=0;for(i=0;i<n;i++){scanf("%d",&m);s^=m;}printf("%d\n",s);}return 0; }另一種方法就是用C++里的容器處理,我看別人這樣寫的,做個參考。具體代碼如下:
#include<stdio.h> #include<set> using namespace std; int main() {int n,a,b,i;set<int> T; //定義一個int型容器while(scanf("%d",&n)!=EOF){b=0;for(i=0;i<n;i++){scanf("%d",&a);if(T.find(a)==T.end()) T.insert(a);//容器中無與a相同的,插入aelse T.erase(a); //找到與a相同的,刪除所有的a}printf("%d\n",*T.begin());T.clear();//清空容器}return 0; }
總結
以上是生活随笔為你收集整理的NYOJ 题目528 找球号(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没错,Java 人的下半场才刚开始!
- 下一篇: 被虐惨!还热乎的腾讯后端一面面经分享!