炸鸡块君的高中回忆(思维)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炸鸡块君的高中回忆(思维)相关的知识,希望对你有一定的参考价值。

题面链接

https://ac.nowcoder.com/acm/contest/23106/E

题面

思路

不难发现一个事情,就是每个轮回外面的同学都是减少m-1个的,但是最后一个回合就得特殊判断一下,很麻烦,所以我们换一个思维看,先让m个同学进去,然后再考虑需要的时间单位就好了

  • 如果n和m相等的话(因为n是大于等于m的)那么花费时间就是1
  • 如果不相等且m为1的话,那么校外的同学永远也进不去
  • 给当前的花费加上 ⌊ n − m m − 1 ⌋ × 2 \\left \\lfloor \\fracn-mm-1 \\right \\rfloor \\times 2 m1nm×2,因为进去出来时间花费为2嘛,如果有余数的话说明还有不足m个人在外面,那么时间花费再增二就好了

详情请看代码

代码

#include<bits/stdc++.h>
using namespace std;
//----------------�Զ��岿��----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------�Զ��岿��----------------
ll n,m,q,a[N];

ll slove()
	if(n == m) return 1;//相等直接返回1就好了,都进去
	if(m == 1) return -1;//不能所有人进入
	n -= m;//不管三七二十一先进去m个人
	ll cnt = n/(m-1);
	ll ans = 1;
	ans += (n/(m-1LL)) * 2;
	if(n % (m-1LL) != 0LL) ans += 2;
	return ans;
	


int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	int t;
	cin>>t;
	while(t--)
		cin>>n>>m;
		cout<<slove()<<endl;
	
	
	return 0;


以上是关于炸鸡块君的高中回忆(思维)的主要内容,如果未能解决你的问题,请参考以下文章

回忆下高中的数学归纳法

test20181016 B君的第三题

高中数学必修五各章思维导图

2022牛客寒假算法基础集训营1全部题解

2022牛客寒假算法基础集训营1题解AHFIDBKG

高中数学思维导图