我需要帮助的codechef

问题描述:

声明解决问题我需要帮助的codechef

考虑的仅由小写字母A-Z长度为N的字符串。假设s[i]是字符串中第i个位置的字符(从1开始)。如果存在i(1 <= i < N)的确切K值,使得s[i+1]<s[i](我们假设为'a'<'b'<'c'<...<'z'),则该字符串是K字符串。给定K,找到最短的K字符串。如果有多种解决方案,请查找词典上最早的K字符串。

输入

第一行包含测试例T(1 < = T < = 100)的数目。每个测试用例都包含一个整数K(≤100)。 输出

输出

Ť线,一个用于每个试验情况下,含有所需的字符串。只能使用小写字母a-z。

我不能理解的是27到100的情况。我可以简单地使用char数组来计算问题 这不是整个算法。我仍然在努力......

#include<iostream> 
using namespace std; 
int main() 
{ 
char s[]={'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
    int k; 
    cin>>k; 
    for(int i=k;i>=1;i--) 
    { 
     //cout<<s[i+1]<<">"<<s[i]; 
     if(s[i+1]>s[i]) 
     cout<<s[i]; 

    } 
    system("pause"); 
    return 0; 
} 
+0

这样s [i + 1] ....句子的结尾是什么? – 2010-09-24 15:36:06

+0

s [i + 1] Ronzii 2010-09-24 15:38:33

最短,然后按字典顺序最早。

所以解决方案将是:

  • BA:K = 1,长度= 2
  • CBA:K = 2,长度= 3
  • DBCA:K = 3,长度= 4
  • ZYX ....一个:K = 25,长度= 26
  • bazyx ....一个:K = 26,长度= 28
  • bcazyx ....一个:K = 27,长度= 29
  • ....

26,你可以这样做:

A,B,Z,A,B

但我认为最佳的解决方案是:

A,b,A,b,... Z

在一般情况下,我认为你需要做一个 '小' 先运行,那么所有的充分运行。

+0

解决方案需要尽可能短,然后如果有多个相同长度的解决方案,请按字典顺序选择第一个解决方案。 – 2010-09-24 15:58:49

+0

你其实已经考虑过s [i + 1]> s [i]“但问题是”s [i + 1] 2010-09-24 16:05:28

+0

我的不好,这个想法仍然适用,颠倒斜坡给出正确的解决方案... – Ssancho 2010-09-24 16:20:03