codeforcesB. Alice‘s Adventures in Permuting
目录
题目:
思路分析:
总代码:
题目:
https://codeforces.com/contest/2028/problem/B
B. 爱丽丝的排列冒险
每个测试时间限制:1秒
每个测试内存限制:256兆字节
爱丽丝把“嬗变”和“排列”搞混了!她有一个由三个整数 nn、bb、cc 定义的数组 aa:数组 aa 的长度为 nn,且 ai=b⋅(i−1)+cai=b⋅(i−1)+c(1≤i≤n1≤i≤n)。例如,当 n=3n=3、b=2b=2、c=1c=1 时,a=[2⋅0+1,2⋅1+1,2⋅2+1]=[1,3,5]a=[2⋅0+1,2⋅1+1,2⋅2+1]=[1,3,5]。
现在,爱丽丝特别喜欢长度为 nn 的排列(即包含 00 到 n−1n−1 所有整数的数组),并希望通过操作将 aa 转化为排列。每次操作中,爱丽丝会将当前数组的最大元素替换为该数组的 MEX(即数组中缺失的最小非负整数)。如果有多个最大值,她选择最左边的那个进行替换。
请你帮助爱丽丝计算,最少需要多少次操作才能使 aa 首次成为排列。如果不可能实现,请输出 −1−1。
排列定义:长度为 nn 的排列是指包含 00 到 n−1n−1 所有整数且不重复的数组。例如,[1,2,0,4,3][1,2,0,4,3] 是排列,但 [0,1,1][0,1,1] 不是(重复出现 11),[0,2,3][0,2,3] 也不是(n=3n=3 但包含 33)。
MEX 定义:数组的 MEX 是指未出现在数组中的最小非负整数。例如,[0,3,1,3][0,3,1,3] 的 MEX 是 22,而 [5][5] 的 MEX 是 00。
输入格式
每个测试包含多个测试用例。第一行输入测试用例数量 tt(1≤t≤10.5,1≤t≤10.5)。随后每个测试用例占一行,包含三个整数 nn、bb、cc(1≤n≤10.18,1≤n≤10.18,0≤b,c≤10.18 0≤b,c≤10.18)。
输出格式
对于每个测试用例,如果无法使 aa 成为排列,输出 −1−1。否则,输出使其首次成为排列所需的最少操作次数。
思路分析:
关键点:这个数组是非递减数组,b等于零时是常数组,b不等于零时是递增数组;
因此我们根据b的正负来分类讨论
同时本数组的最小值一定是c,且数组中小于(n-1)的部分后序可以不用执行操作步骤,只需执行大于n-1的部分的次数即可
总代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000 + 10;
void solve(){int n,b,c;cin >> n >> b >> c;if(b==0){if(c>n-1)cout << n<<endl;else if(c>=n-2)cout << n-1<<endl;else cout << -1 << endl;}else{ if(c>n-1){cout << n << endl;}else if(c==n-1){cout << n-1 << endl;}else {int cnt = (n - 1 - c) / b + 1;cout << n - cnt << endl;}
}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int q; cin >> q;while(q--){solve();}return 0;
}