poj 2211 Photograph 题目链接:http://poj.org/problem?id=2211
数学水(找规律)
题目大意:给议会议员照相,议会人太多,照片不够大,只照的进一部分人,给出一个排列,问这是第几种排列。议会共有n个人(编号1~n),照片装得下k个人,(n、k键盘输入)。排列按编号的字典序。
题目分析:
Hint(case 4):
123//最后一位是5-2出来的
124//倒数第二位是5-1
125
132
134
135
142
143
145
152
153
154//一打头的有12个
2打头的又12个
3打头的又12个
4打头的又12个
512
513
514
521
523
524
531
那么这个例子就是这样:第一位5取5-1=4,4×A42=48,第二位3取3-1=2,2×A31=6,第三位1直接加上即可。
code:
#include<stdio.h>
int main()
{//n:总共有多少人k:一张照片里有多少人a[20]:存给出照片状态
int t,i,i2,j,n,k,a[20],ans,sum;//ans:最终结果sum:中间结果
scanf("%d",&t);//t:testcase、i,i2,j:计数器
for(j=1;j<=t;j++)
{
ans=0;
scanf("%d%d",&n,&k);
for(i=0;i<k;i++)
scanf("%d",a+i);
for(i=0;i<k;i++)
{
sum=*(a+i)-1;
for(i2=n-i-1;i2>=n-k+1;i2--)//
sum*=i2;
ans+=sum;
for(i2=i+1;i2<k;i2++)
{
if(a[i2]>a[i])a[i2]--;
}
}
printf("Variace cislo %d ma poradove cislo %d.\n",j,ans+1);
}
return 0;
}
PS:貌似分析不够透彻……没有完全理解分析过程