题目:棋盘上分布着n个棋子,棋子的座标为(x,y)。将各个棋子变成一行,相同的点只能放一个棋子。计算将这些棋子变成一行,棋子每步可以上下左右移动一格,计算最少需要多少步。
输入:第一输入n,表示棋子的数量。
接下来的n行输入棋子的座标。
示例1:
输入:
3
1 0
2 4
3 2
输出:
4
示例2
输入:
3
1 5
1 6
1 1
输出:
8
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10000;
int a[N];
int b[N];
int Count[N];
int main()
{
int n;
cin >> n;
int stand = 0;
int num = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i] >> b[i];
}
for (int i = 0; i < n; i++)
{
Count[a[i]]++;
stand += b[i];
}
stand = (float)stand / n+0.5;
for (int i = 0; i < n; i++)
{
if (Count[a[i]] == 1)
{
num += abs(stand - b[i]);
}
else if(Count[a[i]]>=2)
{
int k, j;
for (k = a[i] - 1, j = a[i] + 1; k > a[i] - N, j < a[i] + N; k--, j++)
{
if (Count[k] == 0)
{
num = num + abs(stand - b[i]) + abs(a[i] - k);
Count[k]++;
//cout << "(" << k << "," << stand << ")" << endl;
break;
}
else if (Count[j] == 0)
{
num = num + abs(stand - b[i]) + abs(a[i] - j);
Count[j]++;
//cout << "(" << j << "," << stand << ")" << endl;
break;
}
}
Count[a[i]]--;
}
cout << num << " ";
}
cout << endl;
cout << num;
return 0;
}
结果显示: