c++~~帮帮忙~

来源:百度知道 编辑:UC知道 时间:2024/06/27 08:33:02
大虾们~~
帮帮我这个菜鸟吧!!
排列的编码问题(index.cpp)
【问题描述】
对于n个元素的排列P=(p1,p2,...,pn),编写程序,求出该排列在按字典顺序排列之后中的序数d(P),其中pi∈{1,2,...,n}。如:当P={2,3,4,1},则d(P)=10;当P={4,2,1,3},则d(P)=21。
【输入格式】
第一行为k,表示数据组数;
接下来k行,每一行对应一个数据。第一个数为n,接下来为p1 p2 ... pn,其中n表示排列的元素个数,p1 p2 ... pn就是这n个元素的某个排列(每个数以空格隔开)。
【输出格式】
对于每组数据,输出对应的d(P),每一行一个。
【数据范围】
k≤10;n≤50。
【输入样例】
2
4 3 2 1 4
5 3 5 1 2 4
【输出样例】
15
67

放球(ball.cpp)
【问题描述】
给定n个各不相同的球和m个不同的盒子,有多少种不同的放球方法使得每个盒子中的球数不小于k。
【输入格式】
第一行为t,表示数据组数;
接下来k行,每一行三个整数n、m和k。(意义如上)
【输出格式】
对于每组数据,输出对应的方法数,每一行一个。
【数据范围】
t≤10;1≤n,m≤15;0≤k≤15。
【输入样例】
3
3 3 1
2 4 1
3 2 0
【输出样例】
6
0
8
给个标准程序~~~
第二题高精度~~

第一题我不知道序数是什么
第二题代码如下:
#include<iostream.h>

int GetResult(int n,int m,int k)
{
int result=1,i,j,num1,num2;
for(i=0;i<m;i++)
{
num1=1;
num2=1;
for(j=0;j<k;j++)
{
num1*=(n-i*k)-j;
num2*=k-j;
}
result*=num1/num2;
}
for(i=0;i<n-m*k;i++)
{
result*=m;
}
return result;
}
void main()
{
int g,n,m,k,i;
cin>>g;
int** arr=new int*[g];
for(i=0;i<g;i++)
{
cin>>n>>m>>k;
arr[i]=new int[3];
arr[i][0]=n;
arr[i][1]=m;
arr[i][2]=k;
}
cout<<endl;
for(i=0;i<g;i++)
{
cout<<GetResult(arr[i][0],arr[i][1],arr[i][2])<<endl;
}
for(i=0;i<g;i++)
{
delete []arr[i];
}
delete []arr;
}