蜗蜗棋详解

问题:

蜗蜗最近沉迷上了蜗蜗棋

蜗蜗棋里有一颗棋子,一开始出现在数轴上等于 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;
}


        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值