[cf1617C]Paprika and Permutation
Description
给定一个长度为n的数组,可以对任意一个数取模(除数自定义,无约束)。求最少需要几步可以使得数组变成n的排列。
Solution
首先对于一个数\(a_i\)取模,得到的结果范围在\([0,\lfloor\frac{a_i-1}{2}\rfloor]\)且这个范围内的自然数都可以取到。
显然,已经在[1,n]之中的数直接使用更优。
所以我们可以进行贪心,从小到大将还需要取模的每个数映射到剩余的[1,n]中即可。
#include
using namespace std;
const int N=100005;
int a[N],s[N],t[N],n,m,n_s,n_t;
int main(){
int ti;
scanf("%d",&ti);
while(ti--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
n_s=n_t=0;
for(m=1;m<=n&&a[m]<=n;++m);
for(int i=1;i