您的位置:首页 > 产品设计 > UI/UE

codeforces B. Polo the Penguin and Matrix 解题报告

2014-02-07 21:15 417 查看
题目链接:http://codeforces.com/problemset/problem/289/B

题目意思:给出一个 n 行 m 列的矩阵和数值 d 。通过对矩阵里面的数进行 + d 或者 - d 的操作,是否可以使矩阵上的所有数相等。可以的话输出最少的操作步数,否则输出 -1。

由于矩阵的排列对处理没什么影响,因此不需要用到二维数组存储。接着把矩阵中所有的数从小到大进行排序,要想算出最少的步数,很容易想到应该最中间的数(中位数)靠拢。最关键的是如何判断不能通过对矩阵中的数进行处理使得所有数相等。我的做法是,在将每个数向这个中位数靠拢的过程中,它们的差(绝对值)应该能被 d 除尽,一旦有一个不满足,就不可能通过调整使得所有数相等。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn = 10000 + 5;
int a[maxn];

int main()
{
int n, m, i, d;
while (scanf("%d%d%d", &n, &m, &d) != EOF)
{
for (i = 0; i < n*m; i++)
scanf("%d", &a[i]);
sort(a, a+n*m);
if (a[0] == a[n*m-1])  // 常数列,不需要调整为0
printf("0\n");
else
{
int mid = a[n*m/2];
int flag, ans;
flag = ans = 0;
for (i = 0; i < n*m; i++)
{
if (abs(a[i]-mid) % d)
{
flag = 1;
break;
}
else
ans += abs(a[i]-mid) / d;
}
if (flag)
printf("-1\n");
else
printf("%d\n", ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: