问题:
蜗蜗最近沉迷上了蜗蜗棋
。
蜗蜗棋
里有一颗棋子,一开始出现在数轴上等于 x 的位置。
对于每一步,假设当前棋子的位置为 c,如果 c<k,那么蜗蜗会把棋子挪到位置 c+y,否则蜗蜗会把棋子挪到位置 c−z。
给定 x,y,z,k,s,请问 s 步以后棋子在什么位置?
输入格式
第一行一个整数 test 表示数据组数。
对于每组数据,一行五个整数 x,y,z,k,s。
输出格式
对于每组数据,输出一行一个整数表示棋子最后的位置。
对于 100% 的数据,保证 1≤test≤10的5次方,1≤x,y,z,k,s≤10的9次方。
知识点:二分
思路:
先读入五个变量x,y,z,k,s,接着我们想一想,如果s足够大的话,最终答案是不是会在[k - z,k - 1 + y]的位置上来回移动,所以我们二分的分界线就是k - 1 + y(-1的原因是因为c<k才会挪到c+y的位置上,没有等于)
二分代码:
long long l = 0,r = s + 1;
while(l + 1 < r){
long long M = (l + r) / 2;
long long p = s - M;
long long ans = x + M * y - p * z;
if (ans <= k + y - 1){
l = M;
}
else{
r = M;
}
}
最后我们输出x + y * l - (s - l) * z就得出了结果
实现代码:
#include <bits/stdc++.h>
using namespace std;
long long x,y,z,k,s;
int test;
int main(){
scanf ("%d",&test);
for (int i = 1;i <= test;i++){
scanf ("%lld%lld%lld%lld%lld",&x,&y,&z,&k,&s);
long long l = 0,r = s + 1;
while(l + 1 < r){
long long M = (l + r) / 2;
long long p = s - M;
long long ans = x + M * y - p * z;
if (ans <= k + y - 1){
l = M;
}
else{
r = M;
}
}
printf ("%lld\n",x + y * l - (s - l) * z);
}
return 0;
}