E. Two Round Dances

E. Two Round Dances

题解:先从n个元素里选择n/2个,然后另一个圆也就确定了,对两个圆进行圆排列,但可能会有重复的所以/2

圆排列公式:从n个元素中选r进行圆排列。

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int N = 5e3+10;
const int inf = 0x7f7f7f7f;


ll fun(ll n){
    ll sum = 1;
    for(ll i = 1;i <= n;i++){
        sum = sum*i;
    }
    return sum;
}
int main(){
//    srand((unsigned)time(0));
/*
    int n;cin >> n;
    for(int i = 1;i <= n;i++){
        a[i] = i;
    }
    fun1(n);
    int ans = 1;
    do{
        if(fun(n)){
            ans++;
            fun1(n);
        }
    }while(next_permutation(a+1,a+1+n));
    cout<<ans<<endl;
*/
    
    ll n;cin >> n;
    ll ans = 1,x = 1;
    for(ll i = n/2+1;i <= n;i++){
        ans = ans*i;
    }
    for(ll i = 1;i <= n/2;i++){
        x = x*i;
    }
    ans /= x;
    ans = ans*fun(n/2-1)*fun(n/2-1);
    ans /= 2;
    cout<<ans<<endl;
    return 0;
}
/*
2  1
3  1
4  3
5 12
6 60
*/

在 C# 中,你可以创建一个简单的模拟程序来解决这个问题。首先,你可以定义两个类 `Dancer` 和 `Pair`, 分别代表舞者和舞伴对。然后,你可以通过列表或队列的方式来存储舞者,并按性别排序。下面是一个简化的示例代码: ```csharp using System; using System.Collections.Generic; class Dancer { public string Gender { get; set; } public int Order { get; set; } public Dancer(string gender, int order) { Gender = gender; Order = order; } } class Pair { public Dancer Male { get; set; } public Dancer Female { get; set; } public List<int> DanceNumbers { get; private set; } = new List<int>(); public void AddDance(int danceNumber) { DanceNumbers.Add(danceNumber); } } class Program { static void Main() { // 创建男性和女性舞者 List<Dancer> dancers = new List<Dancer>(); for (int i = 0; i < 100; i++) dancers.Add(new Dancer("Male", i)); for (int i = 0; i < 120; i++) dancers.Add(new Dancer("Female", i)); // 按照报名顺序排序 dancers.Sort((a, b) => a.Order.CompareTo(b.Order)); // 配对并分配舞蹈 Queue<Pair> pairsQueue = new Queue<Pair>(); foreach (var dancer in dancers) { if (dancer.Gender == "Male") { if (pairsQueue.Count > 0 && pairsQueue.Peek().Female != null) { Pair currentPair = pairsQueue.Dequeue(); currentPair.Male = dancer; currentPair.AddDance(pairsQueue.Count + 1); // 加上剩余舞伴的数量作为第一支舞 pairsQueue.Enqueue(currentPair); } else { Pair newPair = new Pair(); newPair.Male = dancer; pairsQueue.Enqueue(newPair); } } else // 女性舞者 { if (pairsQueue.Any(p => p.Male != null)) { pairsQueue.Peek().Female = dancer; pairsQueue.Peek().AddDance(pairsQueue.Count + 1); // 同理添加舞蹈 } else { Console.WriteLine($"Warning: No male partner found for female dancer with order {dancer.Order}"); } } } // 输出舞伴对以及每人的舞蹈安排 while (pairsQueue.Count > 0) { Pair pair = pairsQueue.Dequeue(); Console.WriteLine($"Male {pair.Male.Order} dances with Female {pair.Female.Order}:"); foreach (int dance in pair.DanceNumbers) Console.WriteLine($" - Dance {dance}"); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值