STL函数之全排列next_permutation

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35747066/article/details/89297218

题目描述

牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。

输入描述:

每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 n 和 k(1 <= n <= 100, 0 <= k <= 1000000000),接下来的 1 行,包含 n 个数字表示排列 A,其中等于0的项表示看不清的位置(不超过 10 个)。

输出描述:

输出一行表示合法的排列数目。

示例1

输入

5 5
4 0 0 2 0

输出

2
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool Judge(vector<int> Input,int k){
    int Result = 0;
    for(int i = 0;i < Input.size();i ++){
        for(int j = i + 1;j < Input.size();j ++){
            if(Input[i] < Input[j]){
                Result++;
            }
        }
    }
    return (Result == k);
}
int main(){
    int n,k;vector<int> Input;
    int Result = 0;
    cin >> n >> k;
    vector<int> NewInput(n);
    vector<int> NoExistArray;
    for(int i = 0;i < n;i ++){
        int tmp;
        scanf("%d",&tmp);
        Input.push_back(tmp);
    }
    for(int i = 1;i <= n;i ++){
        if(find(Input.begin(),Input.end(),i) == Input.end()){
            NoExistArray.push_back(i);
        }
    }
    int NoExistNum = NoExistArray.size();
    vector<int> Index(NoExistNum);
    for(int i = 0;i < NoExistNum;i ++){
        Index[i] = i;
    }
    do{
        int index = 0;
        for(int i = 0;i < Input.size();i ++){
            if(Input[i] > 0){
                NewInput[i] = Input[i];
            }
            else if(Input[i] == 0){
                NewInput[i] = NoExistArray[Index[index++]];
            }
        }
        if(Judge(NewInput,k)){
            Result ++;
        }
    }while(next_permutation(Index.begin(),Index.end()));
    printf("%d\n",Result);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35747066/article/details/89297218