題目描述:數組
給定 N 張卡片,正面分別寫上 一、二、……、N,而後所有翻面,洗牌,在背面分別寫上 一、二、……、N。將每張牌的正反兩面數字相減(大減少),獲得 N 個非負差值,其中是否存在相等的差? 輸入格式: 輸入第一行給出一個正整數 N(2 ≤ N ≤ 10 000),隨後一行給出 1 到 N 的一個洗牌後的排列,第 i 個數表示正面寫了 i 的那張卡片背面的數字。 輸出格式: 按照「差值 重複次數」的格式從大到小輸出重複的差值及其重複的次數,每行輸出一個結果。 輸入樣例: 8 3 5 8 6 2 1 4 7 輸出樣例: 5 2 3 3 2 2
要點反思:spa
注意:計算差val值時沒有犧牲數組第一位即Diff[0], 則最後遍歷Diff[]數組時不要忽略第一位!!!
本人AC代碼:blog
// 1083 是否存在相等的差 # include <stdio.h> # include <math.h> # define Max 10001 int main(void) { int i, N, temp; int Diff[Max] = {0}; // 記錄不一樣種類差的個數 int val = 0; // 求差 int max = 0; // 記錄val的最大值 scanf("%d",&N); for(i=1; i<=N; i++) { scanf("%d",&temp); val = abs(temp - i); Diff[val]++; if (max < val) { max = val; } } // 倒序遍歷到 Diff[0] for (i=max; i>=0; i--) { if (Diff[i] >= 2) { printf("%d %d\n",i,Diff[i]); } } return 0; }
RRRio