HDU2068

金典错排!

利用组合+错排;说明:其中,如果n=10,错排a[5],表示5个人进行错排,而且也可表示5个人进行了正确的排列;

a[6]表示6个人进行错排,而也可表示4个人进行了正确的排序!


 #include"stdio.h"
double zuhe(int n,int m)
{
 double s=1,i;
 for(i=0;i<m;i++)
  s=s*(n-i)/(i+1);
 return s;
}
int main( )
{
     int n,m,i;
     double s[20],sum;
     s[1]=0;s[2]=1;
     for(i=3;i<20;i++)
      s[i]=(i-1)*(s[i-1]+s[i-2]);
     while(scanf("%d",&n)==1&&n!=0)
     { 
      sum=0;
      if(n%2==0)
       m=n/2;
      else
       m=(n+1)/2;
      for(i=m;i<n;i++)
       sum=sum+zuhe(n,i)*s[n-i];
      printf("%.lf\n",sum+1);
     }
     return 0;
}


### HDU OJ 2068 题目解析与 C++ 实现 对于编号为2068的题目,在杭电在线评测系统(HDU OJ)上,该问题主要涉及字符串处理以及简单的算法逻辑。此题目的核心在于理解输入数据模式并据此构建相应的输出[^1]。 #### 解决方案概述 为了实现这个问题,程序需要读取一系列整数作为输入,并按照特定规则转换成罗马数字表示法输出。具体来说: - 输入部分由多组测试案例组成; - 对于每一组测试案例,先判断其数值范围是否合法(即介于1到3999之间),再将其转化为对应的罗马字符组合形式; #### 关键点分析 在解决这道编程挑战时需要注意几个方面: - 设计合理的映射表来存储阿拉伯数字与其对应罗马符号之间的关系; - 使用循环结构遍历给定区间内的每一个可能值; - 处理特殊情况下的边界条件,比如当遇到4或者9这样的临界情况时应特殊对待; 以下是基于上述思路编写的C++源码片段: ```cpp #include <iostream> using namespace std; string intToRoman(int num){ string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int value[]={1000,900,500,400,100,90,50,40,10,9,5,4,1}; string result=""; for (int i=0;num!=0;++i){ while(num>=value[i]){ num-=value[i]; result+=symbol[i]; } } return result; } int main(){ int n; cin>>n; cout<<intToRoman(n)<<endl; } ``` 通过这段代码可以有效地完成从十进制正整数向罗马数字串的形式转化工作。值得注意的是,这里采用了一个预定义好的数组用于保存基本单位及其组合方式,从而简化了实际编码过程中的复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值