【貪心】Codeforces 349B.Color the Fence題解
阿新 • • 發佈:2018-04-15
結果 感到 left ret 題解 方法 main 這也 ++ 的那個數字i,我們在這裏設這個i為x,表示a[x]是數組a中最小的數的坐標組成的集合中(因為a[i]==min(a[i])的數可能不止一個)對應的坐標最大的那個坐標。
如果這個策略導致
但是還存在一個情況,如果
所以在通過初始方法獲得基本數字之後,我們還要從9遍歷到x+1,看看這些數字是否可以一次代替首位的x,第二位的x,……,直到不能替代為止。
還有一點可能感到困惑的情況是:可能會有同學會覺得這個方法會有錯誤,其實我們是可以推斷的,因為a[x]已經是最小的了,所以最終結果的位數肯定是?v / a[x]?,在這種情況下,我們只需考慮盡可能地讓這個數字的越高位盡可能地大即可,這也是貪心算法所在。
題目鏈接:http://codeforces.com/problemset/problem/349/B
題目大意
小明要從9個數字(1,2,……,9)去除一些數字拼接成一個數字,是的這個數字最大。
但是小明每取一個數字i就會消耗a[i]點體力,小明目前總共有v點體力。
舉個例子:
小明如果有5點體力,而a[1]到a[9]的數值依次為:
5 4 3 2 1 2 3 4 5
那麽最好的辦法就是取5次數字5,因為a[5]=1最小,所以最終得到的數字是11111,比起其他的取數策略所得到的數字都要大。
分析
這道題目可以采用貪心的策略。
要讓數字盡可能地大,我們首先想到的應該是讓這個數字盡可能地“長”,所以我們會下意識的去選 a[i]最小並且i最大
如果這個策略導致
v % a[i] == 0
的話,那麽這個結果就是我們想要的結果。但是還存在一個情況,如果
v == 17 && i == 8
並且a[9] == a[8]+1
的話,我們采用之前的方法得到的是“88”,但是其實結果可以是“98”,因為我們可以用“9”代替結果中的第一個“8”。所以在通過初始方法獲得基本數字之後,我們還要從9遍歷到x+1,看看這些數字是否可以一次代替首位的x,第二位的x,……,直到不能替代為止。
還有一點可能感到困惑的情況是:可能會有同學會覺得這個方法會有錯誤,其實我們是可以推斷的,因為a[x]已經是最小的了,所以最終結果的位數肯定是?v / a[x]?,在這種情況下,我們只需考慮盡可能地讓這個數字的越高位盡可能地大即可,這也是貪心算法所在。
實現
C++代碼實現:
#include <iostream>
using namespace std;
int v, a[10], x = 1, y = 0;
int main() {
cin >> v;
for (int i = 1; i <= 9; i ++) {
cin >> a[i];
if (a[i] <= a[x])
x = i;
}
int left = v % a[x];
int cnt = v / a[x];
for (int i = 9 ; i > x && cnt;) {
if (a[i] <= left + a[x]) {
cout << i;
cnt --;
left -= a[i] - a[x];
}
else {
i --;
}
}
if (cnt == 0) {
cout << -1 << endl;
} else {
while (cnt --) {
cout << x;
}
cout << endl;
}
return 0;
}
【貪心】Codeforces 349B.Color the Fence題解