題目大意: 有一列士兵順序報號(依次加一),如果是正確報數,應該依次加一,從左向右(即1,2,3……X); 現在我們從原始隊伍中抽取一個連續的隊列,這裡有N個士兵。換句話就是,我們有N個士兵一次編號在A到A+N-1之間(1 <= A <= A+N-1 <= X),但是我們不知道A數字的大小,然而我們確定這個隊列是按照原始隊伍從左到右有序排列的。我們確定這N個士兵中只有一個人報號錯誤,現在就要找到這個士兵。 輸入 2 3 1 2 4 3 1001 1002 1004 輸出 Case #1: 3 Case #2: 3 解析: 很容易看出來,我們的任務就是找出犯錯士兵在第一位。 如果這位士兵犯錯的話,那他報的號碼減去前一個號碼不是1(即a[k] - a[k-1] != 1)。而其他士兵是不會犯錯的,即a[i] - a[i-1]==0(i != k)。 易錯點: 1.很容易當成是大數,開始想復雜的運算,實踐證明用int就足夠了; 2.假如抽出的N個士兵第一個就報錯誤的話,我們得單獨考慮,所以可以初始化錯誤的人是p = 1; 代碼:
#include <stdio.h> #include <stdlib.h> int a[100005]; int main(){ int T,tt = 0; int i,j,k,n,p; scanf("%d", &T); while(T--){ scanf("%d", &n); for(i = 1; i<=n; i++) scanf("%d", &a[i]); p = 1; //這個初始化,可以標記是第一個士兵就報錯的情況 for(i = 2; i<=n; i++) if(a[i]!=a[i-1]+1){ p = i; break; } printf("Case #%d: %d\n", ++tt, p); } return 0; }