Poj1850



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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值