• [cf1617C]Paprika and Permutation


    Description

    给定一个长度为n的数组,可以对任意一个数取模(除数自定义,无约束)。求最少需要几步可以使得数组变成n的排列。

    Solution

    首先对于一个数\(a_i\)取模,得到的结果范围在\([0,\lfloor\frac{a_i-1}{2}\rfloor]\)且这个范围内的自然数都可以取到。
    显然,已经在[1,n]之中的数直接使用更优。
    所以我们可以进行贪心,从小到大将还需要取模的每个数映射到剩余的[1,n]中即可。

    #include<bits/stdc++.h>
    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<m;++i){
    			if(a[i]==a[i-1]) s[++n_s]=a[i];
    			else for(int j=a[i-1]+1;j<a[i];++j) t[++n_t]=j;
    		}
    		for(int i=m;i<=n;++i) s[++n_s]=a[i]; 
    		for(int i=a[m-1]+1;i<=n;++i) t[++n_t]=i;
    
    		int ans=0;
    		for(int i=1;i<=n_t;++i){
    			if(t[i]*2<s[i]) ++ans;
    			else{
    				ans=-1;break;
    			}
    		}
    		printf("%d\n",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    设计模式-观察者模式
    获取ubuntu中软件包的有用地址
    vim 简单命令
    adb logcat 日志过滤
    shell编程——
    shell编程——参数传递
    Chromecast
    linux 广播
    【转】Git命令解说
    linux 多播
  • 原文地址:https://www.cnblogs.com/AireenYe/p/cf1617C.html
Copyright © 2020-2023  润新知