(HDU 5802)2016 Multi-University Training Contest 6 Windows 10 (贪心)

思路

为什么贪心题/搜索题也可以这么难TAT
对于给定的n,m,如果 nm 可以直接给出答案
对于 n>m 的情况

答案会出现在一直往下减再往上加和一直往下减休息几次再减之中

  1. 如果 cur>tar 的情况,可以一直往下减
  2. 休息一下的次数可以用来抵消往上加的次数
  3. 题目说不能减到0以下,是指如果减了会小于0,那么音量变成0(不是说不能减)
  4. 任何时候执行加法效果都是一样的

代码

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=a;i<b;i++)
#define debug(a) printf("a =: %d\n",a);
const int INF=0x3f3f3f3f;
const int maxn=1e6+50;
const int Mod=1000000007;
const double PI=acos(-1);
typedef long long ll;
using namespace std;

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif
    int T,cur,tar; 
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&cur,&tar);
        if (cur<=tar) printf("%d\n", tar-cur);
        else{
            int ans=INF,waitCnt=0,downCnt=0;
            int x=1;
            while(cur>=tar){
            //  cout<<cur<<" "<<tar<<endl;
                downCnt++;
                cur-=x;
                x<<=1;
                if (cur<=tar){
                    if (tar-cur<=waitCnt){
                        ans=min(ans,downCnt+waitCnt);
                    }else{
                        ans=min(ans,downCnt+max(tar-max(cur,0),waitCnt));
                        //wait
                        waitCnt++;
                        x>>=1;
                        cur+=x;
                        x=1;
                        downCnt--;
                    }
                }
            }
            printf("%d\n",ans);
        }

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值