PAT 乙级 1083 是否存在相等的差
1. 题目简述及在线测试位置
1.1 从1到N标记N张卡牌,将卡牌乱序,再次从1到N标记。计算两次标记的差值(若差值为负数,取绝对值),对这些差值从大到小排序,打印重复次数大于1的差值:差值 重复次数
1.2 在线测试位置: PAT 1083 是否存在相等的差
2. 基本思路
2.1 先通过数组存储数据:卡牌乱序前后的差值,再通过sort()函数完成排序,最后遍历排序后的数组执行打印
3. 完整AC代码
#include <algorithm>
#include <stdlib.h>
#include <iostream>
using namespace std;
bool Compare(int a, int b)
{
return a > b;
}
int main()
{
int N, Data,Count=1;
cin >> N;
int* a = (int*)malloc(sizeof(int) * (N+1));
for (int i = 1; i <= N; i++)
{
cin >> Data;
a[i] = i - Data; //通过数组a存储数据(卡牌乱序前后的差值)
if (a[i] < 0)
a[i] = a[i] * -1;
}
sort(a + 1, a + N + 1, Compare); //对N个数排序 从编号为1开始, 需要到N+1
int i;
for (i = 1; i < N; i++)
{
if (a[i] == a[i + 1])
Count++;
else
{
if (Count > 1)
{
cout << a[i] << " " << Count << endl;
Count = 1;
}
}
}
if (Count > 1)
cout << a[i] << " " << Count << endl;
return 0;
}