第三屆藍橋杯省賽---錯誤票據
錯誤票據
某涉密單位下發了某種票據,並要在年終全部收回。
因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。
你的任務是通過編程,找出斷號的ID和重號的ID。
假設斷號不可能發生在最大和最小號。
要求程序首先輸入一個整數N(N<100)表示後面數據行數。
接著讀入N行數據。
每行數據長度不等,是用空格分開的若幹個(不大於100個)正整數(不大於100000)
每個整數代表一個ID號。
每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。
要求程序輸出1行,含兩個整數m n,用空格分隔。
其中,m表示斷號ID,n表示重號ID
用戶輸入:
2
5 6 8 11 9
10 12 9
則程序輸出:
7 9
再例如:
用戶輸入:
6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
則程序輸出:
105 120
分析:
思路一:直接用StL,map就很輕松地解決了。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iterator> 6 #include<map> 7 #include<cstdlib> 8using namespace std; 9 10 11 int main(){ 12 map<int,int,less<int> > mymap;//按照key升序排序 13 // map<int,int,greater<int> > revmap; 14 15 int n; 16 cin>>n; 17 int d; 18 while(~scanf("%d",&d)){ 19 if(mymap.count(d)){ 20 mymap[d]++; 21 } 22 else{ 23 mymap.insert(make_pair(d,1)); 24 } 25 } 26 27 map<int,int>::iterator it = mymap.begin(); 28 map<int,int>::iterator rev = mymap.end(); 29 int mini=(*it).first; 30 int maxi=(*(--rev)).first; 31 32 for( int i=mini; i<=maxi; i++ ){ 33 if(!mymap.count(i)){ 34 cout<<i<<" "; 35 break; 36 } 37 } 38 for( ; it!=mymap.end(); it++ ){ 39 if((*it).second==2){ 40 cout<<(*it).first; 41 } 42 } 43 44 return 0; 45 }
思路二:按照題目要求,再輸入數據的同時,運用桶排序計數(記錄每個元素出現過幾次),並找出最大值和最小值,(可以在輸入數據的同時更新最大值和最小值,
也可以在輸入結束之後用sort對整個數組進行排序找出最大值和最小值)。。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 #define INF 0x3f3f3f3f 7 const int maxn = 1e4+10; 8 int arr[maxn]; 9 int b[maxn]; 10 int flag=0;//記錄重復ID 11 int maxi=-INF; 12 int mini=INF; 13 14 int main(int argc, char const *argv[]) 15 { 16 int n; 17 int i=0; 18 cin>>n; 19 int d; 20 while(~scanf("%d",&d)){ 21 arr[++i]=d; 22 b[arr[i]]++; 23 if(b[arr[i]]>1){ 24 flag=arr[i]; 25 } 26 if(mini>arr[i]) mini=arr[i]; 27 if(maxi<arr[i]) maxi=arr[i]; 28 } 29 /*或者用sort進行排序*/ 30 /*sort(arr,arr+sizeof(arr)/sizeof(int));*/ 31 32 for(int i=mini; i<=maxi; i++ ){ 33 if(b[i]==0){ 34 cout<<i<<" "<<flag<<endl; 35 break; 36 } 37 } 38 return 0; 39 }
第三屆藍橋杯省賽---錯誤票據