HDU3687 National Day Parade
国庆游行,学生们本来排成nn的队形,休息时他们仅左右移动,现在求在什么位置恢复nn队形,使所有学生当前位置到目标位置的距离的和最短。 n<=56,m<=200,左上角为(1, 1),右下角为(n, m),每位学生的位置 1<=Xi<=n,1<= Yi<=m
最开始以为是平均数,后来发现就是枚举目标位置。 每行一个vector,存该行点的y坐标。读入后排序,然后枚举队伍最左边的那一列。
#include
#include
#include
#include
using namespace std;
const int MAX = 2147483647;
int main()
{
int n, m;
int a, b;
int count;
while (true)
{
cin >> n >> m;
if (!n && !m) break;
vector line[60];
count = n * n;
while (count--)
{
cin >> a >> b;
line[a].push_back(b);
}
for (int i = 1; i <= n; i++) sort(line[i].begin(), line[i].end());
int sum, ans = MAX;
//起始位置
for (int i = 1; i <= m - n; i++)
{
sum = 0;
//行
for (int j = 1; j <= n; j++)
{
//列
for (int k = 0; k < n; k++)
sum += abs(line[j][k] - i - k); //-(i+k)
}
if (sum < ans) ans = sum;
}
cout << ans << endl;
}
return 0;
}
comments powered by Disqus