1. 程式人生 > >【題解】硬幣交換

【題解】硬幣交換

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; }
參考程序

【題解】硬幣交換