C. Naming Company 贪心

来源:互联网 发布:接单软件 编辑:程序博客网 时间:2024/06/06 20:08

转自:http://blog.csdn.net/ever_glow/article/details/71917393

题目大意:

有两个人,各自有一个字母集合,每个集合里的字母允许重复,而且两个人集合里的字母个数相同,现在他们要给一个公司取名字,名字的长度就是名字中字母的个数,保证名字长度和他们所有拥有的集合里的字母个数相同,他们轮流选一个字母放到名字字符串中的一个位置,而且一旦某个人从他的字母集合中取出一个字母,这个字母就会从他的字母集合中被排除,两个人轮流进行游戏,先进行游戏的人希望该名字尽量升序排列,后进行游戏的人希望名字尽量降序排列,他们两个轮流进行游戏,直到填满这个名字字母序列;(字母仅为小写字母)


基本思路:

(这个题目的意思里是两个人互相都知道对方的字母集合吧)首先第一个人想让名字尽量升序,所以按照从小到大的顺序对他的字符串进行排序,第二个人想要降序,所以将他的字母集合从大到小排序;然后开始轮流放置字母到名字字符串的某个位置,注意每一次放之前要比较当前从头开始记录位置的字母字典序大小:详细思路见代码注释;

Examples
input
tinkoffzscoder
output
fzfsirk
input
xxxxxxxxxxxx
output
xxxxxx
input
ioiimo
output
ioi

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 300000+10;
char s1[maxn];
char s2[maxn];
char s[maxn];
bool cmp1(char c1,char c2)
{
    return c1<c2;
}
bool cmp2(char c1,char c2)
{
    return c1>c2;
}
int main()
{
    scanf("%s",s1);
    scanf("%s",s2);
    int l=strlen(s1);
    sort(s1,s1+l,cmp1);
    sort(s2,s2+l,cmp2);
    int s1_s=0,s1_e=l%2==0?l/2:l/2+1;
    int s2_s=0,s2_e=l/2;
    s1_e--;
    s2_e--;
    int s_s=0,s_e=l-1;
    for(int i=0;i<l;i++)
    {
        if(i&1)//第二个人放置;
        {
            if(s2[s2_s]>s1[s1_s]) //当前第二个最前面的字母字典序大于第一个人最前面的,要想降序最多,直接放在名字字符串当前未放的最前面的位置;
                s[s_s++]=s2[s2_s++];
            else
                s[s_e--]=s2[s2_e--]; //当第二个人的字母小的时候,因为第一个是升序,第二个人是降序,所以以后第一个人最前面的字母一直比第二个人大
                                    //第二个人想要降序最多,肯定放置当前未放位置的最后面;
        }
        else//情况类比第二个人放的情况;
        {
            if(s1[s1_s]<s2[s2_s])
                s[s_s++]=s1[s1_s++];
            else
                s[s_e--]=s1[s1_e--];
        }
    }
    s[l]='\0';//勿忘;
    printf("%s\n",s);
    return 0;
}

0 0
原创粉丝点击