題目:棋盤上分佈着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;
}
結果顯示: