HDU 5802 Windows 10(贪心+DFS)
2016-08-05 23:21
471 查看
题目链接:点击打开链接
题目描述:把音量从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造成干扰,因为我们是把停顿的次数存在一个变量里,没有改变任何状态。
无敌输入输出外挂:
题目描述:把音量从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; }
相关文章推荐
- HDU 5802 Windows 10 (贪心+DFS)
- HDU 5802-J - Windows 10 -贪心+模拟+dfs
- HDU 5802 Windows 10 (贪心+dfs)
- hdu 5802 Windows 10(2016 Multi-University Training Contest 6——贪心+dfs)
- HDU - 5802 Windows 10解题报告(贪心+dfs)
- hdu 5802 Windows 10 (贪心+dfs)
- HDU 5802 Windows 10(贪心+dfs)
- HDU-5802-Windows 10(DFS+贪心)
- HDU-5802-Windows 10-贪心+dfs
- (HDU 5802)2016 Multi-University Training Contest 6 Windows 10 (贪心)
- hdu 5802 Windows 10 (dfs)
- hdu_5802_Windows 10(贪心)
- HDU 5802 Windows 10(dfs)
- hdu-5802 Windows 10(贪心)
- hdu 5802 Windows 10 贪心
- HDU - 5802 Windows 10 dfs + 贪心
- hdu5802 Windows 10(贪心搜索)
- HDU 5802 Windows 10【贪心】
- HDU 5802 Windows 10(dfs)
- hdu 5802 Windows 10 (贪心)