PAT Basic 1083. 是否存在相等的差
PAT Basic 1083. 是否存在相等的差
1. 题目描述:
给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?
2. 输入格式:
输入第一行给出一个正整数 N(2 ≤ N ≤ 10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。
3. 输出格式:
按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。
4. 输入样例:
8
3 5 8 6 2 1 4 7
5. 输出样例:
5 2
3 3
2 2
6. 性能要求:
Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB
思路:
根据题目描述,正整数N的最大值为10000,则非负差值属于闭区间\([10000-10000, 10000-1]\),即\([0,9999]\)。这里定义大小为10000的int型数组delta
统计各差值个数,最后倒序遍历数组进行输出即可。
My Code:
#include <stdio.h>
#define MAX_VAL (9999+1)
int main(void)
{
int cardCount = 0;
int delta[MAX_VAL] = {0};
int i=0; // iterator
int tempDelta = 0;
scanf("%d", &cardCount);
for(i=1; i<=cardCount; ++i)
{
scanf("%d", &tempDelta);
tempDelta = tempDelta - i;
tempDelta = tempDelta>=0 ? tempDelta : -tempDelta;
++delta[tempDelta];
}
for(i=MAX_VAL-1; i>=0; --i)
{
if(delta[i]>1)
{
printf("%d %d\n", i, delta[i]);
}
}
return 0;
}