CF1487-B Cat Cycle

一个规律题目要多做多积累 , 脑子不太灵活

CF1487 Cat Cycle

题目大意:

两只猫A,B, A猫从n -> n-1 -> n-2 ... -> 1 -> 2 ... -> n ; B猫从1 -> 2 -> ... -> n -> n-1 -> ... -> 1

当两猫要相遇时,B猫往所移动得方向+1,而A猫占在相遇的位置上 (题目里面说A猫比B猫大,所以要让座...) .

输入: n为位置长度,k为第k小时 .
输出: 第k时,b猫所在得位置(数字).

思路:

整体而言,就是要知道B猫在k小时内一共移动了多少次,再将移动次数与n直接取模就是答案。

1.显然当n为偶数的时候,两者不可能相遇,将 移动次数 与n直接取模即可 (题目中k为第k小时,所以整体移动次数是k-1次)

2.当n为奇数的时候,在一个n的周期内,没相遇之前两者每移动一次都增加1,由于n为奇数,所以在移动n/2次时,就绝对会相遇一次,这时B猫就多走了一次。
也就是说,在一共移动k-1次中,每n/2次时B猫要多走一部,所以总的移动次数就是原来的再加上增加的,最后于n取模就是答案

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ri register int
#define ll int
#define lll long long 
using namespace std;

ll n,k;
ll t;
int main()
{
	ios::sync_with_stdio(0);
	cout.tie(0),cin.tie(0);
	
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		if(n&1)
		{
			ll mr=n>>1;   //每n/2增加一次
			mr=(k-1)/mr;  //所以移动k-1次要增加(k-1)/(n/2) 次
			k+=mr;        //此时k为B猫一共移动次数  
			ll ans=(k-1)%n;  //取模完事
			cout<<++ans<<"\n";
		}	
		else
		{
			ll ans=(k-1)%n;   // k-1 为移动次数
			cout<<++ans<<"\n";
		}
	}
	
	
	return 0;
}

写的溜的一批,自己就想不到

posted @ 2021-02-16 23:30  gonghw403  阅读(147)  评论(0编辑  收藏  举报