Codeforces Round #302 (Div. 2) 补题

不得不说,真的是渣,只做出了一道题。

 

          A. Set of Strings
 

You are given a string q. A sequence of k strings s1, s2, ..., sk is called beautiful, if the concatenation of these strings is string q (formally, s1 + s2 + ... + sk = q) and the first characters of these strings are distinct.

Find any beautiful sequence of strings or determine that the beautiful sequence doesn't exist.

Input

The first line contains a positive integer k (1 ≤ k ≤ 26) — the number of strings that should be in a beautiful sequence.

The second line contains string q, consisting of lowercase Latin letters. The length of the string is within range from 1 to100, inclusive.

Output

If such sequence doesn't exist, then print in a single line "NO" (without the quotes). Otherwise, print in the first line "YES" (without the quotes) and in the next k lines print the beautiful sequence of strings s1, s2, ..., sk.

If there are multiple possible answers, print any of them.

Sample test(s)
input
1
abca
output
YES
abca
input
2
aaacas
output
YES
aaa
cas
input
4
abc
output
NO
Note

In the second sample there are two possible answers: {"aaaca", "s"} and {"aaa", "cas"}.

 

 

 

题意:输入k  str

问:把str分成k个子序列,使得这k个子序列加起来=str

 

注意:这k个子序列的开头不能有一样的。

 

 

想法:输出前面k-1个子串的时候每个子串尽量短,剩下的都在第k个子串全部输出

     满足和为原串。  

 

 

 

 

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 
  5 using namespace std;
  6 
  7 char s[110];
  8 int vis[30];
  9 
 10 int main()
 11 {
 12     int k;
 13     while(cin>>k)
 14     {
 15         memset(vis,-1,sizeof(vis));
 16 
 17         cin>>s;
 18 
 19         int len=strlen(s);
 20         
 21         
 22         //长度为len的串当然不能分成>len数量的子序列
 23         if(k>len)
 24         {
 25             cout<<"NO"<<endl;
 26             continue;
 27         }
 28         
 29         
 30         //因为子串的开头要求不一样
 31         //统计有多少个不同的字符num
 32         //则最多可以分为num个子串
 33         
 34         int num=0;
 35 
 36         for(int i=0;i<len;i++)
 37         {
 38             if(vis[s[i]-'a']==-1)
 39             {
 40                 vis[s[i]-'a']=i;
 41                 num++;
 42             }
 43         }
 44 
 45         if(num<k)
 46         {
 47             cout<<"NO"<<endl;
 48             continue;
 49         }
 50 
 51         else
 52         {
 53             
 54             cout<<"YES"<<endl;
 55 
 56             int temp=0;
 57             
 58             //打字符串扫一遍
 59             
 60             for(int i=0;i<len;i++)
 61             {
 62                 
 63                 if(k<=1)
 64                     break;
 65 
 66                 if(vis[s[i]-'a']!=-1)
 67                 {
 68                     vis[s[i]-'a']=-1;
 69                     while(true)
 70                     {
 71                         cout<<s[i];
 72                         i++;
 73                         if(vis[s[i]-'a']!=-1)
 74                         {
 75                             cout<<endl;
 76                             temp++;     //统计目前已经输出的子串的个数
 77                             i--;        //多加了一减回去
 78                             break;
 79                         }
 80                     }
 81                 }
 82                 
 83                 //若统计了k-1个子串了,则直接退出循环
 84                 //然后最后一个子串把剩下的字符全部输出
 85                 
 86                 if(temp==k-1)
 87                     break;
 88             }
 89              
 90             //找出现在可以作为开头的字符的位置
 91             //可以作为开头,要没有和前面的子串开头重复的字符
 92             
 93             int m;
 94 
 95             for(int i=0;i<len;i++)
 96             {
 97                 if(vis[s[i]-'a']!=-1)
 98                     {
 99                         m=i;
100                         break;
101                     }
102             }
103             
104             
105             //输出最后一个子串
106             
107             for(int i=m;i<len;i++)
108                 cout<<s[i];
109             cout<<endl;
110 
111         }
112     }
113 
114     return 0;
115 }
View Code

 

 

 

 

 

 

          B. Sea and Islands
 

A map of some object is a rectangular field consisting of n rows and n columns. Each cell is initially occupied by the sea but you can cover some some cells of the map with sand so that exactly k islands appear on the map. We will call a set of sand cells to be island if it is possible to get from each of them to each of them by moving only through sand cells and by moving from a cell only to a side-adjacent cell. The cells are called to be side-adjacent if they share a vertical or horizontal side. It is easy to see that islands do not share cells (otherwise they together form a bigger island).

Find a way to cover some cells with sand so that exactly k islands appear on the n × n map, or determine that no such way exists.

Input

The single line contains two positive integers nk (1 ≤ n ≤ 100, 0 ≤ k ≤ n2) — the size of the map and the number of islands you should form.

Output

If the answer doesn't exist, print "NO" (without the quotes) in a single line.

Otherwise, print "YES" in the first line. In the next n lines print the description of the map. Each of the lines of the description must consist only of characters 'S' and 'L', where 'S' is a cell that is occupied by the sea and 'L' is the cell covered with sand. The length of each line of the description must equal n.

If there are multiple answers, you may print any of them.

You should not maximize the sizes of islands.

Sample test(s)
input
5 2
output
YES
SSSSS
LLLLL
SSSSS
LLLLL
SSSSS
input
5 25
output
NO

 

 

输入n k

给出一个n*n的区域,初始全部为海S

现在要在这个n*n的海上建立刚好k个沙地L

输出建好后的区域

 

沙地的面积不用尽量大(刚开始题目是要求要的,后来修改说不用尽量大了)

没有相邻的边,则为不用的沙地,若有相邻的边,则视为一个

所以根据贪心,沙地要尽量多的话,每一个沙地的面积尽量少,为1*1

一个n*n的区域,最后可以建(n*n+1)/2个沙地

 

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 const int maxn=105;
 8 
 9 char maze[maxn][maxn];
10 
11 int main()
12 {
13     int n,k;
14 
15     while(cin>>n>>k)
16     {
17         int temp=(n*n+1)/2;
18 
19         if(k>temp)
20         {
21             cout<<"NO"<<endl;
22             continue;
23         }
24 
25         cout<<"YES"<<endl;
26 
27         for(int i=0;i<=n+1;i++)
28             for(int j=0;j<=n+1;j++)
29                 maze[i][j]='S';
30 
31         for(int i=1;i<=n;i++)
32         {
33             
34             //打的时候这里没有特判k==0的情况
35             //若数据为1 0
36             //则错啦
37             //因为此时不用修改什么,但是这里还是修改了
38             
39             if(k==0)
40                 break;
41                 
42             for(int j=1;j<=n;j++)
43             {
44                 if(maze[i-1][j]=='S'&&maze[i][j-1]=='S')
45                 {
46                     maze[i][j]='L';
47                     k--;
48                 }
49                 if(k==0)
50                     goto loop;
51             }
52         }
53 
54         loop: ;
55         for(int i=1;i<=n;i++)
56         {
57             for(int j=1;j<=n;j++)
58             {
59                 cout<<maze[i][j];
60             }
61             cout<<endl;
62         }
63     }
64 
65     return 0;
66 }
View Code

 

 

 

 

 

 

 

posted on 2015-05-08 16:29  _fukua  阅读(301)  评论(0编辑  收藏  举报