2013年省賽A組藍橋杯試題--錯誤票據
阿新 • • 發佈:2020-07-27
題目描述:題目描述
某涉密單位下發了某種票據,並要在年終全部收回。 每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。 因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。 你的任務是通過程式設計,找出斷號的ID和重號的ID。 假設斷號不可能發生在最大和最小號。
輸入
要求程式首先輸入一個整數N(N< 100)表示後面資料行數。 接著讀入N行資料。 每行資料長度不等,是用空格分開的若干個(不大於100個)正整數(不大於100000),請注意行內和行末可能有多餘的空格,你的程式需要能處理這些空格。 每個整數代表一個ID號。
輸出
要求程式輸出1行,含兩個整數m n,用空格分隔。 其中,m表示斷號ID,n表示重號ID
樣例輸入
2
5 6 8 11 9
10 12 9樣例輸出
7 9
只是一道藍橋杯真題,出自13年省賽A組試題。難度也並不大,程式碼也可以寫的比較簡潔又不失邏輯,最重要的是易懂,不多blabla。直接上程式碼。
#include<iostream>
using namespace std;
int a[100000];//建立全域性陣列,預設儲存0值
int main()
{
int n;
cin >> n;
int x;
while (cin >> x)//以票據號為索引,所存值為該票據的張數,通過陣列的索引與value建立起了聯絡。
{
a[x]++;
}
int begin, duan, chong;
//下面的迴圈是為了找到票據的第一張
for (begin = 0; begin < 100000; begin++)
{
if (a[begin]!=0)
break;
}
bool flag1 = true, flag2 = true;
//定義倆bool量,方便以下迴圈到合適的時機break,提高效率
for (; (flag1 || flag2) && begin < 100000; begin++)
{
if (a[begin] == 0)
{
flag1 = false;
duan = begin;
}
if (a[begin] == 2)
{
flag2 = false;
chong = begin;
}
}
cout << duan << " " << chong << endl;
system("pause");
return 0;
}