PAT (Basic Level) 1083 是否存在相等的差

給定 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

解題思路:
在循環裏遍歷數組元素,同時求出每個元素與其在數組裏的下標的絕對值差並存放到ans數組裏。隨後問題演化爲在一個數組裏找到重複兩次以上的元素,按元素大小順序輸出該重複元素並輸出重複次數。

代碼:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
bool cmp1(int x, int y)
{
	return x > y;
}
int main()
{
	int a[10000], n, i, ans[10000];
	cin >> n;
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	for (i = 0; i < n; i++)
	{
		ans[i] = abs(a[i] - (i + 1));
	}
	sort(ans, ans + n, cmp1);
	int flag[10000] = { 0 }, count;
	for (i = 0; i < n; i++)
	{
		count = 1;
		if (flag[i] == 0)
		{
			for (int j = i + 1; j < n; j++)
			{
				if (ans[i] == ans[j])
				{
					count++;
					flag[j] = 1;
				}
			}
			if (count > 1)
			{
				cout << ans[i] << " " << count << endl;
			}
		}
	}
	return 0;
}

ps:博主能力有限,如果讀者發現什麼問題,歡迎私信或評論指出不足。歡迎讀者詢問問題,樂意盡我所能解答讀者的問題。歡迎評論,歡迎交流。謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章