题解:CF1617C Paprika and Permutation
一.想法:
先排序,对于已经符合要求的 a[i] 可以直接扔了,然后一个一个的去判断,如果当前的数为 y,那么他只能变成自己本身(比赛时这玩意没看出来,只有 30,太行了)或者 ≤ (y/2) )的数
那不就是贪心吗 ,于是我们只要判断 ≥(x/2)i 即可,如果不行的话,就输出 -1,否则累加我们的小答案。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,a[N],b[N];
int main(){scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);int cntn=0,flag=0;for(int i=n;i>=1;i--){if(a[i]<=n&&a[i]>i){int x=a[i];swap(a[i],a[x]);}}int cnt=0,cntt=0;for(int i=1;i<=n;i++){if(i==a[i]) {continue;}cnt++;b[cnt]=a[i];}sort(b+1,b+cnt+1);for(int i=1;i<=n;i++){if(i==a[i]) {continue; }cntt++;a[i]=b[cnt];}for(int i=1;i<=n;i++){if(a[i]==i){continue;}if(a[i]<=i*2){flag=1;break;}else{cntn++;}}if(flag){printf("-1\n");}else{printf("%d\n",cntn);}}return 0;
}