Poj1850
题意:英文字母串以下方式排列,
1 a
2 b
...
26 z
27 ab
28 ac
...
51 bc
52 bd
...
Vwxyz
要求输入一个以上的字符串,输出它是第几个
方法:递推
举个例子,比如abf,则abd = abc + 3, abc = yz + 1,yz = xz + 1, xz = xy + 1......b = a + 1
根据这个递推式即可知道每个字符串对应的序号
1从右到左找到每一个不与前面相差不为1的字符count = 该字符减去前一个字符,后面的字符串从末位开始依次往前填,(从z开始每个减1)
2若没有找到这样的字符,说明前一个一定是少一个字符的字符串,从z开始往前填满字符串,直到比原字符串少一个.
3到达a的时候返回1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 11
int fun1(int* arr, int len)
{
int count = 0, i = 0;
for(i = len - 1; i > 0; i--)
{
if(arr[i] <= arr[i - 1])
return 0;
}
while(len != 1 || arr[0] != 1)
{
int index = len - 1;
if(len == 1)
{
count += arr[index];
arr[index] = 1;
}
else
{
int j = index, k = index, z = 26;
while(j > 0 && arr[j] - arr[j - 1] == 1){ j--; }
if(j == 0 && arr[j] == 1)
{
len--;
count++;
for(k = index - 1; k > -1; k--)
{
arr[k] = z;
z--;
}
}
else
{
count++;
arr[j]--;
for(k = index; k > j; k--)
{
arr[k] = z;
z--;
}
}
}
}
return count;
}
int main()
{
int i, len = 0;
char s[MAX];
int arr[MAX];
scanf("%s", s);
len = strlen(s);
for(i = 0; i < len; i++)
{
arr[i] = *(s + i) - 96;
}
printf("%d", fun1(arr, len));
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 11
int fun1(int* arr, int len)
{
int count = 0, i = 0;
for(i = len - 1; i > 0; i--)
{
if(arr[i] <= arr[i - 1])
return 0;
}
while(len != 1 || arr[0] != 1)
{
int index = len - 1;
if(len == 1)
{
count += arr[index];
arr[index] = 1;
}
else
{
int j = index, k = index, z = 26;
while(j > 0 && arr[j] - arr[j - 1] == 1){ j--; }
if(j == 0 && arr[j] == 1)
{
len--;
count++;
for(k = index - 1; k > -1; k--)
{
arr[k] = z;
z--;
}
}
else
{
count++;
arr[j]--;
for(k = index; k > j; k--)
{
arr[k] = z;
z--;
}
}
}
}
return count;
}
int main()
{
int i, len = 0;
char s[MAX];
int arr[MAX];
scanf("%s", s);
len = strlen(s);
for(i = 0; i < len; i++)
{
arr[i] = *(s + i) - 96;
}
printf("%d", fun1(arr, len));
system("pause");
return 0;
}