Codeforces Round #455 (Div. 2) A. Generate Login【贪心】

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

 

【题意】:题意是求两个字符串的缩写,具体规则就是两个字符串,每个字符串的缩写可以是0 ~ 字符串长度的任意长,然后合并起来,求字母顺序最小的前缀。

【分析】:substr用于获得子串。

最直接的解决方案是生成所有可能的登录(通过尝试所有非首字母和姓氏的前缀,并将它们组合),并按字母顺序查找最早的字母。为了获得更快的解决方案,需要进行一些观察。首先,在字母最早的登录名中,姓的前缀总是一个字母; 无论使用两个或多个姓氏字母生成的登录信息,都可以通过删除多余的字母来进一步缩短字母以获得更早的登录信息。其次,名字的前缀不能包含任何大于或等于姓的第一个字母的字母,而不是第一个字母。因此,更好的解决方案是:从第二个字母开始迭代第一个字母的字母。一旦找到大于或等于姓氏第一个字母的字母,停止,并返回所有字母,直到这个字母加上姓氏的第一个字母。如果没有找到这样的信件,则返回整个名字加上姓氏的第一个字母。

【代码】:

#include <bits/stdc++.h>

using namespace std;
string s,ss,s1="zzzzzzzzzz";
int main()
{
    cin>>s>>ss;
    for(int i=0;i<s.size();i++)
    {
        for(int j=0;j<ss.size();j++)
        {
            s1=min(s1,s.substr(0,i+1)+ss.substr(0,j+1));
        }
    }
    cout<<s1<<endl;
    return 0;
}
贪心

 

转载于:https://www.cnblogs.com/Roni-i/p/8143309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值