不得不说,真的是渣,只做出了一道题。
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.
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.
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.
1
abca
YES
abca
2
aaacas
YES
aaa
cas
4
abc
NO
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 }
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.
The single line contains two positive integers n, k (1 ≤ n ≤ 100, 0 ≤ k ≤ n2) — the size of the map and the number of islands you should form.
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.
5 2
YES
SSSSS
LLLLL
SSSSS
LLLLL
SSSSS
5 25
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 }