您的位置:首页 > 大数据 > 人工智能

贪心——Windows10 ( HDU 5802 ) ( 2016 Multi-University Training Contest 6 1010 )

2016-08-04 20:19 399 查看
题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5802

分析:

比赛的时候没考虑到可以用上升替代停顿的情况。。。。

题解:

直接的做法是比较 往下降,然后升回来和往下降然后停顿或者上升一些后再开始下降的取值,于是可以化成一个自问题,不断递归DFS即可。

PS:需要记录停顿的次数,然后需要向上的时候就可以用停顿不上去。

标程:

#include <cstdio>
#include <algorithm>
using namespace std;
int T;
long long P, Q;

long long dfs(long long S, long long T, long long step, long long stop)
{
if (S == T)
return step;

long long x = 0;

while (S - (1 << x) + 1 > T)
x++;

if (S - (1 << x) + 1 == T)
return step + x;

long long up = (T - max((long long)0, S - (1 << x) + 1));
long long tmp = x + max((long long)0, up - stop);

return min(tmp + step, dfs(S - (1 << (x - 1)) + 1, T, step + x, stop + 1));
}

int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%lld%lld", &P, &Q);
if (Q >= P)
{
printf("%lld\n", Q - P);
continue;
}
printf("%lld\n", dfs(P, Q, 0, 0));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心 2016多校
相关文章推荐