HDU 5802 Windows 10(贪心+DFS)

来源:互联网 发布:九年级下册历史书淘宝 编辑:程序博客网 时间:2024/04/23 21:33

题目链接:点击打开链接

题目描述:把音量从p变到q,每一秒可以按“上”、“下”按钮或者不按。按“上”按钮每次加1。按“下”按钮:(1)如果上一步按的是“上”或者没有按按钮,则减1;(2)如果上一步按的是“下”按钮同时上一步减少了x,那么这一秒减少2*x。同时音量不能小于0。

解题思路:

如果p<=q,那么答案显然是(q-p)。

如果p>q,从上往下一直贪心,每次减少最大的音量,直到某一秒,按下“下”按钮后,音量会小于q,这时有2种选择:(1)停顿一秒,从1开始减;(2)把音量减少到小于q的值,然后一步一步加1。还需要注意一个问题,在减的过程中可能需要停顿,停顿的效果和按“上”的效果一样,都是下一步减1,在最后阶段,我们需要不停的按“上”来到达q,所以停顿可以变成“上”,这样就能减少最后一个阶段消耗的时间,同时不会对我们DFS造成干扰,因为我们是把停顿的次数存在一个变量里,没有改变任何状态。


#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef __int64 LL;typedef pair<int,int> PII;#define FIN freopen("in.txt", "r", stdin);#define FOUT freopen("out.txt", "w", stdout);#define lson l, mid, cur << 1#define rson mid + 1, r, cur << 1 | 1//#pragma comment(linker, "/STACK:1024000000,1024000000")const int INF = 0x3f3f3f3f;const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;const double EXP = 1e-8;const int MOD = 1e9 + 7;const int MAXN = 1e5 + 50;const int MAXM = 2e4 + 50;int p, q;int dfs(LL start, int step, int stop){    if (start == q)        return step;    int x = 0;    while (start - ((1 << x) - 1) > q)        x++;    LL nxt = start - ((1 << x) - 1);    if (nxt == q)        return step + stop + x;    int up = q - max(0LL, nxt);    return min(step + stop + x + max(0, up - stop), dfs(start - ((1 << (x - 1)) - 1), step + x - 1, stop + 1));}int main(){#ifdef LOCAL_NORTH    FIN;#endif // LOCAL_NORTH    int tcase;    scanf("%d", &tcase);    while (tcase--)    {        scanf("%d%d", &p, &q);        if (p <= q)        {            printf("%d\n", q - p);            continue;        }        printf("%d\n", dfs(p, 0, 0));    }#ifdef LOCAL_NORTH    cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl;#endif // LOCAL_NORTH    return 0;}

无敌输入输出外挂:

#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef __int64 LL;typedef pair<int,int> PII;#define FIN freopen("in.txt", "r", stdin);#define FOUT freopen("out.txt", "w", stdout);#define lson l, mid, cur << 1#define rson mid + 1, r, cur << 1 | 1//#pragma comment(linker, "/STACK:1024000000,1024000000")const int INF = 0x3f3f3f3f;const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;const double EXP = 1e-8;const int MOD = 1e9 + 7;const int MAXN = 1e5 + 50;const int MAXM = 2e4 + 50;namespace fastIO{    #define BUF_SIZE 100000    #define OUT_SIZE 100000    #define ll long long    //fread->read    bool IOerror=0;    inline char nc(){        static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;        if (p1==pend){            p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin);            if (pend==p1){IOerror=1;return -1;}            //{printf("IO error!\n");system("pause");for (;;);exit(0);}        }        return *p1++;    }    inline bool blank(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}    inline void read(int &x){        bool sign=0; char ch=nc(); x=0;        for (;blank(ch);ch=nc());        if (IOerror)return;        if (ch=='-')sign=1,ch=nc();        for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';        if (sign)x=-x;    }    inline void read(ll &x){        bool sign=0; char ch=nc(); x=0;        for (;blank(ch);ch=nc());        if (IOerror)return;        if (ch=='-')sign=1,ch=nc();        for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';        if (sign)x=-x;    }    inline void read(double &x){        bool sign=0; char ch=nc(); x=0;        for (;blank(ch);ch=nc());        if (IOerror)return;        if (ch=='-')sign=1,ch=nc();        for (;ch>='0'&&ch<='9';ch=nc())x=x*10+ch-'0';        if (ch=='.'){            double tmp=1; ch=nc();            for (;ch>='0'&&ch<='9';ch=nc())tmp/=10.0,x+=tmp*(ch-'0');        }        if (sign)x=-x;    }    inline void read(char *s){        char ch=nc();        for (;blank(ch);ch=nc());        if (IOerror)return;        for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch;        *s=0;    }    inline void read(char &c){        for (c=nc();blank(c);c=nc());        if (IOerror){c=-1;return;}    }    //getchar->read    inline void read1(int &x){        char ch;int bo=0;x=0;        for (ch=getchar();ch<'0'||ch>'9';ch=getchar())if (ch=='-')bo=1;        for (;ch>='0'&&ch<='9';x=x*10+ch-'0',ch=getchar());        if (bo)x=-x;    }    inline void read1(ll &x){        char ch;int bo=0;x=0;        for (ch=getchar();ch<'0'||ch>'9';ch=getchar())if (ch=='-')bo=1;        for (;ch>='0'&&ch<='9';x=x*10+ch-'0',ch=getchar());        if (bo)x=-x;    }    inline void read1(double &x){        char ch;int bo=0;x=0;        for (ch=getchar();ch<'0'||ch>'9';ch=getchar())if (ch=='-')bo=1;        for (;ch>='0'&&ch<='9';x=x*10+ch-'0',ch=getchar());        if (ch=='.'){            double tmp=1;            for (ch=getchar();ch>='0'&&ch<='9';tmp/=10.0,x+=tmp*(ch-'0'),ch=getchar());        }        if (bo)x=-x;    }    inline void read1(char *s){        char ch=getchar();        for (;blank(ch);ch=getchar());        for (;!blank(ch);ch=getchar())*s++=ch;        *s=0;    }    inline void read1(char &c){for (c=getchar();blank(c);c=getchar());}    //scanf->read    inline void read2(int &x){scanf("%d",&x);}    inline void read2(ll &x){        #ifdef _WIN32            scanf("%I64d",&x);        #else        #ifdef __linux            scanf("%lld",&x);        #else            puts("error:can't recognize the system!");        #endif        #endif    }    inline void read2(double &x){scanf("%lf",&x);}    inline void read2(char *s){scanf("%s",s);}    inline void read2(char &c){scanf(" %c",&c);}    inline void readln2(char *s){gets(s);}    //fwrite->write    struct Ostream_fwrite{        char *buf,*p1,*pend;        Ostream_fwrite(){buf=new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;}        void out(char ch){            if (p1==pend){                fwrite(buf,1,BUF_SIZE,stdout);p1=buf;            }            *p1++=ch;        }        void print(int x){            static char s[15],*s1;s1=s;            if (!x)*s1++='0';if (x<0)out('-'),x=-x;            while(x)*s1++=x%10+'0',x/=10;            while(s1--!=s)out(*s1);        }        void println(int x){            static char s[15],*s1;s1=s;            if (!x)*s1++='0';if (x<0)out('-'),x=-x;            while(x)*s1++=x%10+'0',x/=10;            while(s1--!=s)out(*s1); out('\n');        }        void print(ll x){            static char s[25],*s1;s1=s;            if (!x)*s1++='0';if (x<0)out('-'),x=-x;            while(x)*s1++=x%10+'0',x/=10;            while(s1--!=s)out(*s1);        }        void println(ll x){            static char s[25],*s1;s1=s;            if (!x)*s1++='0';if (x<0)out('-'),x=-x;            while(x)*s1++=x%10+'0',x/=10;            while(s1--!=s)out(*s1); out('\n');        }        void print(double x,int y){            static ll mul[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,                1000000000,10000000000LL,100000000000LL,1000000000000LL,10000000000000LL,                100000000000000LL,1000000000000000LL,10000000000000000LL,100000000000000000LL};            if (x<-1e-12)out('-'),x=-x;x*=mul[y];            ll x1=(ll)floor(x); if (x-floor(x)>=0.5)++x1;            ll x2=x1/mul[y],x3=x1-x2*mul[y]; print(x2);            if (y>0){out('.'); for (size_t i=1;i<y&&x3*mul[i]<mul[y];out('0'),++i); print(x3);}        }        void println(double x,int y){print(x,y);out('\n');}        void print(char *s){while (*s)out(*s++);}        void println(char *s){while (*s)out(*s++);out('\n');}        void flush(){if (p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}}        ~Ostream_fwrite(){flush();}    }Ostream;    inline void print(int x){Ostream.print(x);}    inline void println(int x){Ostream.println(x);}    inline void print(char x){Ostream.out(x);}    inline void println(char x){Ostream.out(x);Ostream.out('\n');}    inline void print(ll x){Ostream.print(x);}    inline void println(ll x){Ostream.println(x);}    inline void print(double x,int y){Ostream.print(x,y);}    inline void println(double x,int y){Ostream.println(x,y);}    inline void print(char *s){Ostream.print(s);}    inline void println(char *s){Ostream.println(s);}    inline void println(){Ostream.out('\n');}    inline void flush(){Ostream.flush();}    //puts->write    char Out[OUT_SIZE],*o=Out;    inline void print1(int x){        static char buf[15];        char *p1=buf;if (!x)*p1++='0';if (x<0)*o++='-',x=-x;        while(x)*p1++=x%10+'0',x/=10;        while(p1--!=buf)*o++=*p1;    }    inline void println1(int x){print1(x);*o++='\n';}    inline void print1(ll x){        static char buf[25];        char *p1=buf;if (!x)*p1++='0';if (x<0)*o++='-',x=-x;        while(x)*p1++=x%10+'0',x/=10;        while(p1--!=buf)*o++=*p1;    }    inline void println1(ll x){print1(x);*o++='\n';}    inline void print1(char c){*o++=c;}    inline void println1(char c){*o++=c;*o++='\n';}    inline void print1(char *s){while (*s)*o++=*s++;}    inline void println1(char *s){print1(s);*o++='\n';}    inline void println1(){*o++='\n';}    inline void flush1(){if (o!=Out){if (*(o-1)=='\n')*--o=0;puts(Out);}}    struct puts_write{        ~puts_write(){flush1();}    }_puts;    inline void print2(int x){printf("%d",x);}    inline void println2(int x){printf("%d\n",x);}    inline void print2(char x){printf("%c",x);}    inline void println2(char x){printf("%c\n",x);}    inline void print2(ll x){        #ifdef _WIN32            printf("%I64d",x);        #else        #ifdef __linux            printf("%lld",x);        #else            puts("error:can't recognize the system!");        #endif        #endif    }    inline void println2(ll x){print2(x);printf("\n");}    inline void println2(){printf("\n");}    #undef ll    #undef OUT_SIZE    #undef BUF_SIZE};using namespace fastIO;int p, q;int dfs(int start, int step, int stop){    int x = 0;    while (start - ((1 << x) - 1) > q)        x++;    int nxt = start - ((1 << x) - 1);    if (nxt == q)        return step + stop + x;    int up = q - max(0, nxt);    return min(step + stop + x + max(0, up - stop), dfs(start - ((1 << (x - 1)) - 1), step + x - 1, stop + 1));}int main(){#ifdef LOCAL_NORTH    FIN;#endif // LOCAL_NORTH    int tcase;    scanf("%d", &tcase);    while (tcase--)    {        fastIO::read(p);        fastIO::read(q);        if (p <= q)        {            printf("%d\n", q - p);            continue;        }        printf("%d\n", dfs(p, 0, 0));    }#ifdef LOCAL_NORTH    cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC * 1000 << " ms." << endl;#endif // LOCAL_NORTH    return 0;}




0 0
原创粉丝点击