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

题意就是说给一列序列...其顺序是 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; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值