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

来源:互联网 发布:淘宝店取什么名字好 编辑:程序博客网 时间:2024/05/24 04:52

思路

为什么贪心题/搜索题也可以这么难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;}
0 0
原创粉丝点击