牛客网-数列还原

数列还原

解题思路:稍加分析,根据数据规模,先对模糊的数字全排列吗,然后组成完整的数组,再判断完整的数组是否满足条件。 

失误:把简单的问题想的有点复杂了。

import java.util.*;
public class Main {
    public static List<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
    public static List<Integer> temp=new ArrayList<Integer>();
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            int k=in.nextInt();
            int num[]=new int[n+1];
            int visit[]=new int[n+1];
            List<Integer> list=new ArrayList<Integer>();
            for(int i=1;i<=n;i++){
                num[i]=in.nextInt();
                visit[num[i]]=1;
            }
            for(int i=1;i<=n;i++){
                if(visit[i]==0){
                    list.add(i);
                }
            }
            res.clear();
            temp.clear();
            int visit2[]=new int[list.size()];
            dfs(visit2,list);
            int rescnt=0;
            for(int i=0;i<res.size();i++){
                List<Integer> temp2=res.get(i);
                int cnt3=0;
                int tempnum[]=new int[n+1];
                for(int j=1;j<=n;j++){
                    if(num[j]==0){
                        tempnum[j]=temp2.get(cnt3++);
                    }else{
                        tempnum[j]=num[j];
                    }
                }
                if(f1(tempnum)==k)
                    rescnt++;
            }
            System.out.println(rescnt);
        }
    }
    public static int f1(int num[]){
        int cnt=0;
        for(int i=1;i<num.length;i++){
            for(int j=i+1;j<num.length;j++){
                if(num[j]>num[i])
                    cnt++;
            }
        }
        return cnt;
    }
    public static void dfs(int visit[],List<Integer> list){
        if(temp.size()==list.size()){
            res.add(new ArrayList(temp));
        }else{
            for(int i=0;i<list.size();i++){
                if(visit[i]==0){
                    visit[i]=1;
                    temp.add(list.get(i));
                    dfs(visit,list);
                    visit[i]=0;
                    temp.remove(temp.size()-1);
                }
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值