本文主要是介绍Codeforces 479B Towers(暴力),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:Codeforces 479B Towers
题目大意:给定N和K,表示有N堆盘子,K次操作,每次可以将一堆中的顶部的盘子移动到另外一堆上。现在要使得这
N堆盘子中个数最多的减掉个数最少的值要尽量少,输出最小值和移动的步数,以及移动策略。
解题思路:数据量不大,直接枚举即可,每次将从最多的那堆移动一个到最少的那堆。
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
const int maxn = 1005;
const int inf = 1e5;int N, K, A[maxn], X[maxn], Y[maxn], pMax, pMin;void find () {pMax = pMin = 0;int vMax = 0, vMin = inf;for (int i = 1; i <= N; i++) {if (A[i] > vMax) {vMax = A[i];pMax = i;}if (A[i] < vMin) {vMin = A[i];pMin = i;}}
}int solve() {find();for (int i = 0; i < K; i++) {if (A[pMax] - A[pMin] <= 1)return i;X[i] = pMax;Y[i] = pMin;A[pMax]--; A[pMin]++;find();}return K;
}int main () {scanf("%d%d", &N, &K);for (int i = 1; i <= N; i++)scanf("%d", &A[i]);int ans = solve();printf("%d %d\n", A[pMax] - A[pMin], ans);for (int i = 0; i < ans; i++)printf("%d %d\n", X[i], Y[i]);return 0;
}
这篇关于Codeforces 479B Towers(暴力)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!