UVA 1610

3 篇文章 0 订阅
2 篇文章 0 订阅

题目概要:输入一个n(2<=n<=1000&&n为偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中一半的字符串小于等于S,另一半大于S。

如果有多解,输出字典序最小的解。


一道注重细节的搜索题。

先排序,然后取中间两个进行处理。

WA了很多次,看了网上的题解,但是觉得题解if那么多情况,那是得多仔细才能搞出来。于是我宁愿牺牲一点效率也要把处理的难度降下来,用最简单的暴搜,逐个遍历26个字母,挑出第一个满足的即可。这里的搜索是深搜,采用的是直接迭代。

废话不多说,直接上代码:

#include<stdio.h>
#include<string>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

string solve(const string& str1, const string& str2)
{
	int minsize = str1.size() < str2.size() ? str1.size() : str2.size();
	for (int i = 0;i != minsize;++i)
	{
		if (str1[i] != str2[i])
		{
			int index = i;
			string ret = str1.substr(0, i);
			for (char k = str1[index];k <= 'Z';++k)
			{
				string temp = ret;
				temp += k;
				if (temp >= str1&&temp < str2)
					return temp;
				if (k == 'Z')
				{
					ret += str1[index];
					k = 'A' - 1;
					if (++index == str1.size())
						break;
				}
			}
		}
	}
	return str1;
}
int main()
{
	int n;
	while (cin >> n && n)
	{
		vector<string> w;
		int cnt = n;
		while (cnt--)
		{
			string str;
			cin >> str;
			w.push_back(str);
		}
		sort(w.begin(), w.end());
		cout << solve(w[(n / 2) - 1], w[n / 2]) << "\n";
	}
	return 0;
}
很多人错都不知道错在哪,下面我给几个测试用例,这几个加上UVA给的能过的话,应该可以AC

input

2

AZZZCCC

B

2

AZZ

B

2

FIRD

FIREDIE

2

JEOAAA

JERAAS

0

OUTPUT


AZZZD

AZZ

FIRD

JEP





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值