【題解】硬幣交換
阿新 • • 發佈:2019-05-02
2個 else 技術分享 play esp targe 格式 文件 clas
題目描述
小z最近迷上了一款遊戲——To Be A Farmer,他在遊戲中控制的人物是一個叫FZ的Farmer。FZ身上有G1個金幣、S1個銀幣和B1個銅幣,而他至少需要G2個金幣、S2個銀幣和B2個銅幣。為了完成這個目標,小z只好控制FZ來到了遊戲中的銀行。銀行有如下規定:
(1)你可以用1個金幣交換9個銀幣;
(2)你可以用11個銀幣交換1個金幣;
(3)你可以用1個銀幣交換9個銅幣;
(4)你可以用11個銅幣交換1個銀幣;
小z看到這些規定,頓時頭都大了,只好求助於你。聰明的你來幫助他解決這樣一個問題:最少需要交換多少次硬幣才能至少擁有G2個金幣、S2個銀幣和B2個銅幣呢?
輸入格式
第一行包含三個整數,G1、S1和B1。
第二行包含三個整數,G2、S2和B2。
0≤G1、S1、B1、G2、S2、B2≤1000000。
輸出格式
如果可以完成任務的話,輸出文件中應包含一個整數,表示最少交換次數;否則包含一個整數-1。
輸入樣例
10 0 0
0 0 81
輸出樣例
10
題解
這裏我們用$a,b,c$表示$g,s,b$。
我們通過減少$b1$先讓$a1,c1$達到$a2,c2$,此時我們只需要考慮$b1$是否能達到$b2$了。
容易想到,如果要讓次數盡可能少,那就要盡可能用$a1$來更新$b1$。
我們按照先後順序用$a1,c1$來更新$b1$,要求$a1,c1$都始終達到$a2,c2$,最後判斷$b1$是否達到$b2$即可。
#include <iostream> using namespace std; int a1, b1, c1, a2, b2, c2; int ans; int main() { cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2;參考程序if(a1 < a2) { ans += a2 - a1; b1 -= (a2 - a1) * 11; a1 = a2; } if(c1 < c2) { ans += (c2 - c1 + 8) / 9; b1 -= (c2 - c1 + 8) / 9; c2 += (c2 - c1 + 8) / 9 * 9; } if(b1 < b2 && a1 > a2) { if(b1 + (a1 - a2) * 9 < b2) { ans += (a1 - a2); b1 += (a1 - a2) * 9; a1 = a2; } else { ans += (b2 - b1 + 8) / 9; a1 -= (b2 - b1 + 8) / 9; b1 += (b2 - b1 + 8) / 9 * 9; } } if(b1 < b2) { if(b1 + (c1 - c2) / 11 >= b2) { ans += (c1 - c2) / 11; b1 += (c1 - c2) / 11; c1 -= (c1 - c2) / 11 * 11; } } cout << (b1 >= b2 ? ans : -1); return 0; }
【題解】硬幣交換