请大佬指点一下是否有问题
查看原帖
请大佬指点一下是否有问题
1366067
wei_learn_city楼主2024/7/28 22:26

思路是总的排列减去本身减去存在位置重合的情况只有15分

信封问题

题目描述

某人写了 nn 封信和 nn 个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。

输入格式

一个信封数 nn,保证 n≤20n \le 20。

输出格式

一个整数,代表有多少种情况。

样例 #1

样例输入 #1

2

样例输出 #1

1

样例 #2

样例输入 #2

3

样例输出 #2

2

提示

对于 100%100 \% 的数据,1≤n≤201 \le n \le 20。

#include<bits/stdc++.h>
using namespace std;
int ans,a[25],b[25],s=1;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        a[i]=i;
        b[i]=a[i];
    }
    for(int i=n;i>=1;i--)
    {
        s=s*i;
    }
    while(next_permutation(a+1,a+n+1))
    {
        for(int i=1;i<=n;i++)
        {
            if(a[i]==b[i])
            {
                ans++;
            }
        }
    }
    cout<<s-ans-1;
    
}
2024/7/28 22:26
加载中...