专栏文章
题解:CF2122B Pile Shuffling
CF2122B题解参与者 2已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mioiy3tx
- 此快照首次捕获于
- 2025/12/02 19:58 3 个月前
- 此快照最后确认于
- 2025/12/02 19:58 3 个月前
题目大意
有 个二进制堆,其中第 个堆顶部有 个 , 个 。
每次操作中,你可以取出任意堆的顶部元素,并将其移动到任意堆的任意位置(包括原堆)。
计算最少需要多少次操作,才能使第 个堆形成顶部 个 和底部 个 的目标状态。
思路
需要分开计算 和 所需要的操作次数。
的移动次数
如果 ,那么现在要把多余的 放到其他堆去,此时需要移动 次。
如果 ,那么现在要从其它堆取 放到第 堆,此时需要操 次。
的移动次数
如果 ,那么现在要把多余的 放到其他堆去,但是要先把上方的 移到堆的中间,所以要先操作 次(此时不需要除以 ,因为这次操作发生在同一堆内,所以不会被重复计算),再操作 次。
如果 ,那么现在只要从其它堆取 放到第 堆即可,此时需要操作 次。
注意事项
-
注意由于每次操作会在不同的两个堆内被算,所以最后的结果需要除以 ,才是最终的答案。
-
多测不清空,爆零两行泪。
-
十年 OI 一场空,不开
long long见祖宗。
关键代码
CPPcin>>n;
sum=0;
for(int i=0;i<n;i++)
{
cin>>a>>b>>c>>d;
if(a>c) sum+=a-c;
else if(a<c) sum+=c-a;
if(b>d) sum+=b-d+a*2;
else if(b<d) sum+=d-b;
}
cout<<sum/2<<endl;
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...