现在的位置: 首页 > 综合 > 正文

POJ 1469 – 排列组合的思维..

2014年01月14日 ⁄ 综合 ⁄ 共 795字 ⁄ 字号 评论关闭

   题意就是说给一列序列...其顺序是   1 : a  ..  2 : b ... 26 : z ... 27 : ab..28 : ac.....51 : az...52 : bc...类似这样...其中的字符串都是每一位比前一位大...最长为vwxyz...给出一个字符串..求出其在队列中的序列号...

   这道题就是用一个排列组合....比如求 bdf ... 求出1位和2为总共有多少个..然后每一位就依次求出前一位这么长能排多少位...

   例如 bdf  =  C ( 26 , 1 ) + C ( 26 , 2 ) + C ( 25 , 2 ) + C ( 23 , 1 ) + C  (  21  , 0 )  

                       1位的总数      2位的总数    a**的总数    c*的总数          e的总数 

  已这种思想来写就可以....

                           

Program:

#include<iostream>
using namespace std;
char s[10];
int getdata(int a,int b)
{
    int i,ans=1; 
    for (i=0;i<b;i++) ans*=(a-i);
    for (i=1;i<=b;i++) ans/=i;
    return ans;   
}
int getanswer()
{
      int i,j,l,ans;
      l=strlen(s);  
      for (i=1;i<l;i++) 
        if (s[i]<=s[i-1]) return 0; 
      ans=1;
      for (i=1;i<l;i++) ans+=getdata(26,i);
      for (i=1;i<=s[0]-'a';i++)
        ans+=getdata(26-i,l-1);
      for (i=1;i<l;i++)
       for (j=s[i-1]-'a'+2;j<=s[i]-'a';j++)
        ans+=getdata(26-j,l-i-1);
      return ans;
}
int main()
{ 
     while (gets(s)) printf("%d\n",getanswer()); 
     return 0;   
}

抱歉!评论已关闭.