炸鸡块君的高中回忆(思维)
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 ⌊m−1n−m⌋×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;
以上是关于炸鸡块君的高中回忆(思维)的主要内容,如果未能解决你的问题,请参考以下文章