POJ - 1850 排列组合
2016-07-17 16:28
239 查看
http://poj.org/problem?id=1850
Code
Description
Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made
only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character).
The coding system works like this:
• The words are arranged in the increasing order of their length.
• The words with the same length are arranged in lexicographical order (the order from the dictionary).
• We codify these words by their numbering, starting with a, as follows:
a - 1
b - 2
...
z - 26
ab - 27
...
az - 51
bc - 52
...
vwxyz - 83681
...
Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code.
Input
The only line contains a word. There are some constraints:
• The word is maximum 10 letters length
• The English alphabet has 26 characters.
Output
The output will contain the code of the given word, or 0 if the word can not be codified.
按照题目中的规律
1个字母时有 C(26,1)种情况
2个 C(26,2)种
3个 C(26,3)种
......
解题思路就是首先将26以内的组合数打出来,再遍历整个串,按照规律依次计算即可,注意要保证按照字典序上升的
顺序,否则不成立,即输出答案为0
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int C[110][110];
void fun(){
memset(C, 0, sizeof(C));
C[0][0] = 1;
for(int i=0; i<=26; i++){
for(int j=0; j<=i; j++){
if(i==j||j==0)
C[i][j] = 1;
else
C[i][j] = C[i-1][j-1]+C[i-1][j];
}
}
}
int main(){
int i, j, k, sum;
fun();
char ch[20], c;
while(cin>>ch){
int l = strlen(ch);
sum = 0;
bool flag = true;
for(i=1; i<l; i++){
if(ch[i-1]>ch[i]){
printf("0\n");
flag = false;
break;
}
}
if(!flag)
continue;
for(i=1; i<l; i++)
sum += C[26][i];
for(i=0; i<l; i++){
if(i!=0){
c = ch[i-1]+1;
while(c<ch[i]){
sum += C['z'-c][l-i-1];
c++;
}
}
else{
c = 'a';
while(c<ch[i]){
sum += C['z'-c][l-i-1];
c++;
}
}
}
cout<<sum+1<<endl;
}
return 0;
}
Code
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 9259 | Accepted: 4419 |
Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made
only of small characters of the English alphabet a,b,c, ..., z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character).
The coding system works like this:
• The words are arranged in the increasing order of their length.
• The words with the same length are arranged in lexicographical order (the order from the dictionary).
• We codify these words by their numbering, starting with a, as follows:
a - 1
b - 2
...
z - 26
ab - 27
...
az - 51
bc - 52
...
vwxyz - 83681
...
Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code.
Input
The only line contains a word. There are some constraints:
• The word is maximum 10 letters length
• The English alphabet has 26 characters.
Output
The output will contain the code of the given word, or 0 if the word can not be codified.
按照题目中的规律
1个字母时有 C(26,1)种情况
2个 C(26,2)种
3个 C(26,3)种
......
解题思路就是首先将26以内的组合数打出来,再遍历整个串,按照规律依次计算即可,注意要保证按照字典序上升的
顺序,否则不成立,即输出答案为0
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int C[110][110];
void fun(){
memset(C, 0, sizeof(C));
C[0][0] = 1;
for(int i=0; i<=26; i++){
for(int j=0; j<=i; j++){
if(i==j||j==0)
C[i][j] = 1;
else
C[i][j] = C[i-1][j-1]+C[i-1][j];
}
}
}
int main(){
int i, j, k, sum;
fun();
char ch[20], c;
while(cin>>ch){
int l = strlen(ch);
sum = 0;
bool flag = true;
for(i=1; i<l; i++){
if(ch[i-1]>ch[i]){
printf("0\n");
flag = false;
break;
}
}
if(!flag)
continue;
for(i=1; i<l; i++)
sum += C[26][i];
for(i=0; i<l; i++){
if(i!=0){
c = ch[i-1]+1;
while(c<ch[i]){
sum += C['z'-c][l-i-1];
c++;
}
}
else{
c = 'a';
while(c<ch[i]){
sum += C['z'-c][l-i-1];
c++;
}
}
}
cout<<sum+1<<endl;
}
return 0;
}
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- 【组合数学】卡塔兰数
- 组合数学学习之排列、组合、圆周排列实现
- poj 3252组合数学
- 卡特兰数(Catalan)及应用
- POJ1833-排列
- Nim取子游戏
- Crazy tea party
- Biorhythms (POJ1006)
- 1139: 出栈序列统计
- POJ 3292.Semi-prime H-numbers
- Java 产生随机的一组排列
- Catalan数
- poj_1942
- poj_1850
- HDU 4832 Chess (动态规划+组合数学)
- hdoj_2049 不容易系列之(4)——考新郎
- hdoj_2048 神、上帝以及老天爷
- hdoj_2047 阿牛的EOF牛肉串
- hdoj_2046 骨牌铺方格