1487B.Cat Cycle

链接:

https://codeforces.com/problemset/problem/1487/B

题意

有n个点,年长的猫从n点开始睡觉每一小时递减到下一个点睡觉,例如:n->n-1->n-1->…->1;年轻的猫则相反:1->2->3->…->n;中间如果两只猫相遇,年轻的猫需让年长的猫,进而前往该点的下一个点,即例如相遇的点为3,如果n = 3,年轻的猫前往1点,如果n > 3,年轻的猫前往6(5 + 1)。

问经过k小时后,年轻的猫在哪个点?(有多组案例)

Example

input
7
2 1
2 2
3 1
3 2
3 3
5 5
69 1337

output
1
2
1
3
2
2
65

解析

如果n为偶数,则非常简单只需取k除n的余数即可,即为(k - 1) % n + 1;如果n为奇数,则情况复杂一些,以n = 5为例,如图
在这里插入图片描述
由图可见,在第一个循环中,第3步相遇了,第二个循环中第5步和第7步相遇了,第三个循环中第9步和第13步相遇了,从中发现了规律,因为一个从头开始,一个从尾开始,由于对称性两者第一次相遇肯定是第(n + 1) / 2步相遇,即其中经历了n / 2步,而前面发现相遇的步数3, 5, 7, 9, 13…都经历了n / 2的整数倍,它们都是第(n / 2) + 1步,这些特殊的点即表示点数+1,所以k小时内一共走过的点数可以表示为(k + (k - 1) / (n / 2)),(k - 1)表示经历过的步数,所以转化为结果即为(k - 1 + (k - 1) / (n / 2)) % n + 1。
然后受范一行(带范)的影响,代码能一行绝不两行,所以把两种情况合二为一,即在(k - 1) / (n / 2)前多乘一个(n % 2),如果为0即n为偶数,(k - 1) / (n / 2)就不影响,若为1,奇数,就可以起到范一行的作用。

#include <iostream>

using namespace std;

int main()
{
	int _;
	cin >> _;
	
	while (_--)
	{
		int n, k;
		cin >> n >> k;

		int t = k - 1;  //经历过的步数
		int flag = n / 2; 

		cout << ((k - 1) + (n % 2) * t / flag) % n + 1 << endl;
	}

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值