JZOJ.1153【貪心算法】硬幣交換

好難啊!!!

可聰明的我仍是解出來了!(逃

題目描述

小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個銀幣呢?c++

輸入

第1行包含三個整數:G一、S1和B1。
第2行包含三個整數:G二、S2和B2。
0 ≤ G一、S一、B一、G二、S二、B2 ≤ 10000000。spa

輸出

若是能夠完成任務的話,輸出一個整數表示最少交換次數;不然輸出整數-1。code

樣例輸入

10 0 0
0 0 81遊戲

樣例輸出

10ci

初步思路:

  1. 判斷可不能夠恰好用完。
  2. 若是不,則將現有金錢經過兌換減小。(1個金幣,2次交換 金->銀->金,減爲原來的9/11)
  3. 重複1,2,直到恰好換到所需的錢。

碼完代碼,提交到OJ,真是:it

TLE裏說今年,聽取WA~聲一片!

介才系建切希露:

  1. 將銀幣換爲所需金幣和銅幣。
  2. 判斷已有銀幣和所需銀幣的大小。
  3. 若所需銀幣大於已有銀幣,則是Impossible。
  4. 反之則模擬 暴力 次數。

代碼在這兒(說得這麼明白,都不想放了)class

#include<bits/stdc++.h>
using namespace std;

int a1,b1,c1,a2,b2,c2,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;
        }
    }
    b1 >= b2 ? cout<<ans<<endl : cout<<-1<<endl; 
    return 0;
}
相關文章
相關標籤/搜索