codeforces 794c

来源:互联网 发布:图书管理系统java需求 编辑:程序博客网 时间:2024/06/18 15:24

比赛的时候。。先yy了一发题目。然后wa了一发之后想清楚了应该怎么搞。。然后就玩了一个半钟,代码敲搓。
(主要当时竟然想到直接计数。。计数这个是个巨坑,千万不能计数啊!!!)

题目:http://codeforces.com/problemset/problem/794/C

题目大意:
有两个人想要开公司,两个人手上有相同长度为n的字符串集合,他们需要给公司搞一个名字。
公司名为长度为n的字符串,每次A玩家先从自己集合里挑一个放字符放里面,B玩家再从自己的集合里挑一个字符放里面,直到公司名完成为止。

A玩家想要公司名字典序尽量小
B玩家想要公司名字典序尽量大
A和B分别知道对方的集合里还剩下什么字符。
现在在两个人足够聪明的情况下,请问会产生出怎样的公司名。

思路:
比赛的时候思路一直是对的。。只是代码搞搓了。。orz
对于A和B:
当A集合中存在比B集合的字符要小的字符的时候,
A肯定想尽量的把小的字符放到最前面,B肯定想尽量把大的字符放到最前面。

当A集合中存在比B集合的字符要大或等于的时候,
A肯定想尽量把还需要放的字符中最大的放到最后面,
B肯定想尽量把还需要放的字符中最小的放到最后面,

就是一道贪心题。直接模拟一下字符串放置就好了。。

/*@resources: codeforces@date: 2017-5-13@author: QuanQqqqq@algorithm:*/#include <bits/stdc++.h>#define ll long long#define eps 1e-6using namespace std;char str1[400005],str2[400005],str3[400005];int main(){    gets(str1);    gets(str2);    int len = strlen(str1);    sort(str1,str1 + len);    sort(str2,str2 + len);    int t1 = 0,t2 = len - 1,idx = len - 1;    bool flag = true,change = false;    for(int i = 0;i < len;i++){        if(str1[t1] >= str2[t2] && !change){            change = true;            int tlen = len - i;            int tmp1 = i % 2 ? tlen / 2 : (int)ceil(tlen / 2.0);            int tmp2 = i % 2 ? (int)ceil(tlen / 2.0) : tlen / 2;            tmp1--,tmp2--;            while(tmp1--){                t1++;            }            while(tmp2--){                t2--;            }        }        if(flag){            if(change){                str3[idx--] = str1[t1];                t1--;            } else {                str3[i] = str1[t1];                t1++;            }        } else {            if(change){                str3[idx--] = str2[t2];                t2++;            } else {                str3[i] = str2[t2];                t2--;            }        }        flag = !flag;    }    str3[len] = '\0';    printf("%s\n",str3);}
原创粉丝点击