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

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/-maybe/p/4488060.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码下载:完整代码,可直接运行 ;运行版本:2022a或2019b或2014a;若运行有问题,可私信博主; **仿真咨询 1 各类智能优化算法改进及应用** 生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化 **2 机器学习和深度学习方面** 卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断 **3 图像处理方面** 图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知 **4 路径规划方面** 旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化 **5 无人机应用方面** 无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配 **6 无线传感器定位及布局方面** 传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化 **7 信号处理方面** 信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化 **8 电力系统方面** 微电网优化、无功优化、配电网重构、储能配置 **9 元胞自动机方面** 交通流 人群疏散 病毒扩散 晶体生长 **10 雷达方面** 卡尔曼滤波跟踪、航迹关联、航迹融合

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值