uva1610

/*
大体思路是用string存储字符串,从小到大进行排序,因为n是偶数所以直接选出中间两个字符串left和right来计算结果。
从left的第一个元素开始,先把他+1,然后累加到ans中,如果此时ans小于right,那么ans一定是最优解,直接跳出循环输出结果。
如果ans大于或等于right,说明+1后ans大了,把他-1回到正常值,然后继续循环。。。。。。
然后要注意细节,首先+1时不能超过Z,然后注意处理最后一个元素,因为+1法对最后一个元素无效
最后庆幸没有空串
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;
string a[1005];
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        string left=a[n/2-1];
        string right=a[n/2];
        int len=left.size();
        string ans;
        for(int i=0;i<len;i++)
        {
            if(left[i]+1<=‘Z‘&&i!=len-1)
            {
                ans+=left[i]+1;
                if(ans<right)
                    break;
                ans[i]--;
            }
            else
                ans+=left[i];
        }
        cout<<ans<<endl;
    }
    return 0;
} 
时间: 2024-11-05 02:18:12

uva1610的相关文章

UVa1610 Party Games (字符串)

链接:http://bak2.vjudge.net/problem/UVA-1610 分析:把n个字符串排序,拿中间两个字符串s1和s2比较即可.因为s1<s2,所以可以确定枚举len(s1)个长度肯定能找到解,然后从'A'开始枚举ans的每个位置,首先解要求最短,所以先循环找一个ans>=s1的解,注意保证ans[i]<='Z',判断是否满足条件,满足就是最优解则输出,否则将ans[i]置为s1[i],保证最优解的字典序最小,接着重复上述步骤枚举ans的下一个位置. 1 #includ

uva1610 聚会游戏(细节处理)

uva1610 聚会游戏(细节处理) 输入一个n(n<=1000且为偶数)个字符串的集合D,找一个长度最短的字符串(不一定要在D中出现)S,使得D中恰好一半字符串小于等于S,另一半大于S.如果有多解,输出字典序最小的解. 首先找到两个中位字符串S1和S2.显然,答案S必须夹在S1和S2之间.由于要找最短的字符串,我们可以用迭代加深的思路,根据|S|迭代加深枚举.每次枚举长度时,必须保证S的前|S|-1位和S1相同,然后最后一位枚举26个字符.这是一个贪心,应该不难证.我用了第k大数和跳过公共前缀

UVA-1610 Party Games (构造)

题目大意:给出一系列字符串,构造出一个字符串大于等于其中的一半,小于另一半. 题目分析:取大小为中间的两个a,b(a<b).实际上就是找出第一个小于b的同时大于等于a的字符串,直接构造即可.要注意细节. 代码如下: # include<iostream> # include<cstdio> # include<string> # include<cstring> # include<algorithm> using namespace st

UVA1610(贪心)

题意: 给出n个串(n为偶数): 要构造一个串,使n串中有一半小于等于它,另外一半大于它: 要求这个串长度尽量小,同时字典序小: 思路: 把所有串排个序: 然后拿出中间的两个串比较: AC #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<iostream> using namespace std; const int N = 1005

UVA1610 PartyGame 聚会游戏(细节题)

给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S.输入保证一定有解.长度要尽量短,在此基础上字典序尽量小. 分类谈论,细节挺多的,比如'Z'. 其实直接暴就过了,没分类辣么麻烦. #include<bits/stdc++.h> using namespace std; vector<string> vec; int main() { // freopen("in.txt","r",stdin); int n; char

uva1610 Party Games

细节值得注意 注意vector<string>是可以直接sort的! #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; vector<string> str; int main(){ int n; while(cin>>n&& n){ str.clear(); s

UVa 1610 聚会游戏

https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后选择中间的两个,比较他们就可以了.可以用枚举法来比较. 1 #include<string> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 100