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 除尽,一旦有一个不满足,就不可能通过调整使得所有数相等。
题目意思:给出一个 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; }
相关文章推荐
- 1056解题报告
- [leetcode] 67. Add Binary 解题报告
- 1109解题报告
- HDU1789 解题报告
- 【LeetCode】56. Merge Intervals 解题报告
- HDOJ 1033 Edge解题报告
- [leetcode] 28. Implement strStr() 解题报告
- POJ 2406 KMP 解题报告
- 【原创】leetCodeOj --- Word Ladder II 解题报告 (迄今为止最痛苦的一道题)
- [leetcode] 13. Roman to Integer 解题报告
- 【Noi OpenJudge】 带通配符的字符串匹配 解题报告
- Codeforces Round #287 (Div. 2) 解题报告 A.B.C.D.E
- uva839解题报告
- 【LeetCode】327. Count of Range Sum(Hard)解题报告
- 寒假训练4解题报告
- [leetcode] 16. 3Sum Closest 解题报告
- Leetcode 126. Word Ladder II 字符变换2 解题报告
- POJ3974 Palindrome 解题报告【字符串】【Manacher】
- POJ 1904 King's Quest 解题报告
- N - TOYS解题报告(来自网络)