UVA - 1610 Party Games 贪心

题目大意:给出2*n个字符串,要求你将这些字符串分成两组,一组是小于等于目标字符串的,一组是大于目标字符串的,这两组字符串的个数要相等,现在要求你求出这个目标字符串,使得目标字符串的长度尽量短且字典许最小

解题思路:先排序,再找出两组的边界字符串,比较这两个字符串
如果位置上的字符相等的话就照抄
设大的字符串为b,小的字符串为a,目标字符串为ans
if(b[i] == a[i]) ans += a[i]
在上面条件不成立的情况下再讨论:
1.if(i == a.size() - 1) 也就是说扫描到a的最后一个了,那么ans += a[i]
2.if(b[i] - a[i] > 1 || i != b.size() - 1) ans += a[i] + 1
表示b字符串的字符比a字符串的字符至少大于2或者b字符串的字符比a字符串的字符大一且b字符串还没有扫描
3.是b字符串扫描到最后一个了,且b字符串的最后一个字符比a字符串的该位置字符之差为1,这就要再扫描一下a字符串了
I. if(a.size() - 1 == j || a[j] == ‘Z’) ans += a[j] 扫描完的话就直接赋值或者无法改变值了就照搬
排除上面的情况,只需要ans += a[j] + 1就比a字符串大了

具体看代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
#define maxn 1010
string str[maxn];
int n;

void init() {
    for(int i = 0; i < n; i++)
        getline(cin,str[i]);
    sort(str,str+n);
}

void solve() {

    string a = str[n / 2 - 1];
    string b = str[n / 2];
    string ans;
    for(int i = 0; i < a.size() && i < b.size(); i++) {
        if(a[i] == b[i])
            ans += a[i];
        else {
            if(i == a.size() - 1)
                ans += a[i];
            else if(b[i] - a[i] > 1 || i != b.size() - 1) {
                ans += (a[i] + 1);
                break;
            }
            else {
                ans += a[i];
                for(int j = i + 1; j < a.size(); j++)
                    if(j == a.size() - 1 || a[j] == 'Z')
                        ans += a[j];
                    else {
                        ans += (a[j] + 1);
                        break;
                    }

                break;
            }
        }
    }
    cout << ans << endl;
}

int main() {
    while(scanf("%d", &n) == 1 && n) { 
        getchar();
        init();
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值