1083 是否存在相等的差 (20 分)

  • 2019 年 11 月 8 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/shiliang97/article/details/99652060

1083 是否存在相等的差 (20 分)

給定 N 張卡片,正面分別寫上 1、2、……、N,然後全部翻面,洗牌,在背面分別寫上 1、2、……、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

水題,注意兩個點

1.輸出差值大於0的

2.輸出出現次數大於1的

考慮這兩個邊界值就行了

#include<iostream>  using namespace std;  int cha[10005];  int main(){  	int n,a,ca;  	cin>>n;  	for(int i=1;i<=n;i++){  		cin>>a;  		ca=i-a;  		if(ca<0){  			cha[-ca]++;  		}  		else cha[ca]++;  	}  	while(n>=0){  		if(cha[n]>1){  			cout<<n<<" "<<cha[n]<<endl;  		}  		n--;  	}  	return 0;  }

這是偷來柳神的答案

我覺得最後輸出的時候直接用while循環會更好,因為差值最大是n-1;

(感覺自己寫的竟然比柳神優化的更好一點,有點美滋滋)

#include <iostream>  using namespace std;  int main() {      int n, t, a[10000] = {0};      cin >> n;      for (int i = 1; i <= n; i++) {          cin >> t;          a[abs(t-i)]++;      }      for (int i = 9999; i >= 0; i--)          if (a[i] >= 2) cout << i << " " << a[i] << endl;      return 0;