zoukankan      html  css  js  c++  java
  • Codeforces Round #455 (Div. 2)(A,B,C)

    A. Generate Login
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    The preferred way to generate user login in Polygon is to concatenate a prefix of the user's first name and a prefix of their last name, in that order. Each prefix must be non-empty, and any of the prefixes can be the full name. Typically there are multiple possible logins for each person.

    You are given the first and the last name of a user. Return the alphabetically earliest login they can get (regardless of other potential Polygon users).

    As a reminder, a prefix of a string s is its substring which occurs at the beginning of s: "a", "ab", "abc" etc. are prefixes of string "{abcdef}" but "b" and 'bc" are not. A string a is alphabetically earlier than a string b, if a is a prefix of b, or a and b coincide up to some position, and then a has a letter that is alphabetically earlier than the corresponding letter in b: "a" and "ab" are alphabetically earlier than "ac" but "b" and "ba" are alphabetically later than "ac".

    Input

    The input consists of a single line containing two space-separated strings: the first and the last names. Each character of each string is a lowercase English letter. The length of each string is between 1 and 10, inclusive.

    Output

    Output a single string — alphabetically earliest possible login formed from these names. The output should be given in lowercase as well.

    Examples
    Input
    harry potter
    Output
    hap
    Input
    tom riddle
    Output
    tomr

    暴力一遍找到最小的前缀
     1 #include <iostream>
     2 #include <cstring>
     3 
     4 using namespace std;
     5 string s,ss;
     6 
     7 int k[26];
     8 int a[26];
     9 int main(){
    10     cin>>s>>ss;
    11     int slen = s.length();
    12     int sslen = ss.length();
    13     string s1="zzzzzzzzzz",s2;
    14     for(int i=0;i<slen;i++){
    15         for(int j=0;j<sslen;j++){
    16             s2 = s.substr(0,i+1)+ss.substr(0,j+1);
    17             s1 = min(s1,s2);
    18             // cout<<s1<<" "<<s2<<" *** "<<endl;
    19         }
    20     }
    21     cout<<s1<<endl;
    22     return 0;
    23 }
    B. Segments
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given an integer N. Consider all possible segments on the coordinate axis with endpoints at integer points with coordinates between 0 and N, inclusive; there will be of them.

    You want to draw these segments in several layers so that in each layer the segments don't overlap (they might touch at the endpoints though). You can not move the segments to a different location on the coordinate axis.

    Find the minimal number of layers you have to use for the given N.

    Input

    The only input line contains a single integer N (1 ≤ N ≤ 100).

    Output

    Output a single integer - the minimal number of layers required to draw the segments for the given N.

    Examples
    Input
    2
    Output
    2
    Input
    3
    Output
    4
    Input
    4
    Output
    6
    Note

    As an example, here are the segments and their optimal arrangement into layers for N = 4.

    其实只要两次循环并且自加,其实这种题应该是有公式直接套的。

    (公式的话(n+1)/2*(n-(n+1)/2))

    但是那样感觉没啥意思。

     1 #include <iostream>
     2 #include <cstring>
     3 #define N 105
     4 using namespace std;
     5 
     6 int vis[N];
     7 int n;
     8 int main(){
     9     while(cin>>n){
    10         memset(vis,0,sizeof(vis));
    11         for(int i=1;i<=n;i++){
    12             for(int j=i;j<=n;j++){
    13                 for(int l=i;l<=j;l++){
    14                     vis[l]++;
    15                 }
    16             }
    17         }
    18         int cnt = 0;
    19         for(int i=1;i<105;i++){
    20             cnt = max(cnt,vis[i]);
    21         }
    22         cout<<cnt<<endl;
    23     }
    24     return 0;
    25 }
    C. Python Indentation
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    In Python, code blocks don't have explicit begin/end or curly braces to mark beginning and end of the block. Instead, code blocks are defined by indentation.

    We will consider an extremely simplified subset of Python with only two types of statements.

    Simple statements are written in a single line, one per line. An example of a simple statement is assignment.

    For statements are compound statements: they contain one or several other statements. For statement consists of a header written in a separate line which starts with "for" prefix, and loop body. Loop body is a block of statements indented one level further than the header of the loop. Loop body can contain both types of statements. Loop body can't be empty.

    You are given a sequence of statements without indentation. Find the number of ways in which the statements can be indented to form a valid Python program.

    Input

    The first line contains a single integer N (1 ≤ N ≤ 5000) — the number of commands in the program. N lines of the program follow, each line describing a single command. Each command is either "f" (denoting "for statement") or "s" ("simple statement"). It is guaranteed that the last line is a simple statement.

    Output

    Output one line containing an integer - the number of ways the given sequence of statements can be indented modulo 109 + 7.

    Examples
    Input
    4
    s
    f
    f
    s
    Output
    1
    Input
    4
    f
    s
    f
    s
    Output
    2
    Note

    In the first test case, there is only one way to indent the program: the second for statement must be part of the body of the first one.


    simple statement
    for statement
    for statement
    simple statement

    In the second test case, there are two ways to indent the program: the second for statement can either be part of the first one's body or a separate statement following the first one.


    for statement
    simple statement
    for statement
    simple statement

    or


    for statement
    simple statement
    for statement
    simple statement

    题意:python 里面,给出 n 个 for 循环或陈述语句,'f' 里面必须要有语句。按 python 缩进的方式组合成合法的程序,问有多少种可能方案。

    tags: dp

    dp[i][j] 表示第 i 个语句缩进为 j 时的可能方案数, 转移:

    1】 如果第 i 个是 'f' , 则第 i+1 个肯定要比第 i 个多缩进一个单位,即 dp[i+1][j+1] = dp[i][j]。

    2】如果第 i 个是  's' ,则第 i+1 个可以属于前面任何一个 for 循环,也就是说第 i+1 个的缩进要 <= 第 i 个的缩进,即 dp[i+1][j] = dp[i][k], j<=k<=n 。

    复杂度 O(n^2)。

     1 #include <iostream>
     2 #include <cstring>
     3 #define N 5005
     4 typedef long long int ll;
     5 #define mod 1000000007
     6 using namespace std;
     7 int n;
     8 char c;
     9 ll dp[N][N];
    10 int main(){
    11     ios::sync_with_stdio(false);
    12     cin.tie(0);
    13     cin>>n;
    14     memset(dp,0,sizeof(dp));
    15     dp[1][0]=1;
    16     for(int i = 1;i < n;i++){
    17         cin>>c;
    18         if(c == 'f'){
    19             for(int j=0;j<=n;j++){
    20                 dp[i+1][j+1] = dp[i][j];
    21             }
    22         }else{
    23             ll sum = 0;
    24             for(int j = n;j >= 0;j--){
    25                 sum += dp[i][j];
    26                 sum %= mod;
    27                 dp[i+1][j] = sum;
    28             }
    29         }
    30     }
    31     cin>>c;
    32     ll ans = 0;
    33     for(int i=0;i<=n;i++){
    34         ans += dp[n][i];
    35         ans%=mod;
    36     }
    37     cout<<ans<<endl;
    38     return 0;
    39 }
  • 相关阅读:
    通过rabbitmqadmin管理rabbitmq
    OpenCASCADE Incremental Mesh
    RvmTranslator6.6
    PipeCAD之管道标准库PipeStd(2)
    PipeCAD之管道标准库PipeStd
    OpenCASCADE Face Normals
    OpenCASCADE Make Face With Holes
    RvmTranslator6.5 is released
    qmake生成Visual Studio工程
    Levmar:Levenberg-Marquardt非线性最小二乘算法
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/8135164.html
Copyright © 2011-2022 走看看