hdu5802Windows 10(贪心+dfs)

来源:互联网 发布:网络直播招聘 编辑:程序博客网 时间:2024/06/05 06:00

题目大意

调节音量s到t,上升音量每秒只能上升1,下降音量每秒为2*x,x为上一次下降的音量,如果下降时休息或者上升音量则x置为1,音量最低为0

思路就是贪心的去选,每次下降到终点上的最近一点,或者终点下的一点,取得一个最小值就好。这题题意没弄明白,WA了好几发。

AC代码:

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const ll inf=1<<30;ll sum[50],p,q,ans;void init(){    ll res=1;    sum[0]=0,sum[1]=1;    for(int i=2;i<=32;i++){        res=res*2;        sum[i]=sum[i-1]+res;    }}ll dfs(ll x,int step,int stop){if(x==q)return step;int k=0;    while(x-sum[k]>q)k++;//cout<<k<<endl;    if(x-sum[k]==q)return step+k;ll up=q-max((ll)0,x-sum[k]);ll res=k+max((ll)0,up-stop);return min(step+res,dfs(x-sum[k-1],step+k,stop+1));}int main(){    int t;    scanf("%d",&t);init();    while(t--){        ans=inf;        scanf("%lld%lld",&p,&q);if(q>=p){printf("%lld\n",q-p);continue;}        printf("%lld\n",dfs(p,0,0));    }}


0 0
原创粉丝点击