喫水果(貪心+思維)

題目鏈接https://ac.nowcoder.com/acm/contest/5026/B

題目描述
最近米咔買了n個蘋果和m個香蕉,他每天可以選擇喫掉一個蘋果和一個香蕉(必須都喫一個,即如果其中一種水果的數量爲0,則他不能進行這個操作),或者使用魔法將某一種水果的數量翻倍。
現在米咔想喫西瓜了,但是他的主人賽小息不讓他買新水果,除非蘋果和香蕉沒有了,即數量都是0了。
現在米咔想知道,最少用多少天他可以喫光蘋果和香蕉。
可以證明的是,一定存在一種方案可以讓米咔在若干天后喫光蘋果和香蕉。

輸入描述:
第一行一個正整數T(T≤100),代表數據組數。接下來T行每行兩個正整數n,m(n,m ≤100000)。

輸出描述:
共T行,每行一個正整數代表答案。

輸入

3
1 1
1 2
2 5

輸出

1
3
7

說明

對於第三組測試樣例(2,5),第一天令n翻倍變成(4,5),接下來連續喫三天水果變成(1,2),第五天令n翻倍變成(2,2),接下來連續喫兩天水果,在第七天時喫光蘋果和香蕉。

分析
貪心:我們翻倍要做到既讓水果得到最大程度的補充,又不能超過max(n,m)則進行翻倍。
這裏蘋果和香蕉是等地位的。
代碼

#include<cstdio>
#include<cstring>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        if(n==m)
        {
            printf("%d\n",m);
            continue;
        }
        if(n<m)
            swap(n,m);
        int sum=0;
        while(m!=0)
        {
            if(2*m<=n)
            {
                sum++;
                m*=2;
                continue;
            }
            m--,n--;
            sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章