Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)D Dense Subsequence

传送门:D Dense Subsequence

题意:输入一个m,然后输入一个字符串,从字符串中取出一些字符组成一个串,要求满足:在任意长度为m的区间内都至少有一个字符被取到,找出所有可能性中字典序最小的情况,并按字典序输出

思路:字典序 例如 aaaaaaab < ab  也就是说,如果满足要求的取法中取到了b 那么所有的a都应该被取到,这样才可以保证字典序最小,那么也就是说在26个字母中找到一定要被取的最大字母,然后再确定最大的字母的个数,比它小的全部要取

AC代码:

 1 #include "stdio.h"
 2 #include "string.h"
 3 int main()
 4 {
 5     int m,k,flag,i,j,c[30],now;
 6     char s[100005];
 7     while(scanf("%d",&m)!=EOF)
 8     {
 9         getchar();
10         gets(s);
11         memset(c,0,sizeof(c));
12         int l=strlen(s);
13         for(j=0+'a'; j<26+'a'; j++)
14         {
15             k=0;flag=1;
16             for(i=0; i<l; i++)
17             {
18                 k++;
19                 if(s[i]<=j)
20                 {
21                     k=0;
22                     if(s[i]==j) c[j-'a']++;
23                 }
24                 if(k>=m)
25                     flag=0;
26             }
27             if(flag) break;
28         }
29         k=0;c[j-'a']=0;now=0;
30         for(i=0; i<l; i++)
31         {
32             k++;
33             if(s[i]<j)
34                 k=0;
35             else if(s[i]==j)
36                 now=i;
37             if(k==m)
38             {
39                 k=0;
40                 i=now;
41                 c[j-'a']++;
42             }
43         }
44         for(i=0; i<=26; i++)
45         {   //printf("%d ",c[i]);
46             for(j=0; j<c[i]; j++)
47                 printf("%c",i+'a');
48         }
49         printf("
");
50     }
51     return 0;
52 }
原文地址:https://www.cnblogs.com/max88888888/p/5962583.html