zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SVN操作指南
    .NET Tools
    SQL条件查询控件
    txt文件导入Sql Server数据库表方法
    黑盒测试用例设计方法
    JS库
    在 C# 中 ("x" == "X") 何时成立?
    奶牛问题,别人写的,自己试了一下.
    Some Cool Tips For .NET
    Excel Data Reader Read Excel files in .NET
  • 原文地址:https://www.cnblogs.com/-maybe/p/4488060.html
Copyright © 2011-2022 走看看