UVA-1610 Party Games (构造)

题目大意:给出一系列字符串,构造出一个字符串大于等于其中的一半,小于另一半。

题目分析:取大小为中间的两个a,b(a<b)。实际上就是找出第一个小于b的同时大于等于a的字符串,直接构造即可。要注意细节。

代码如下:

# include<iostream>
# include<cstdio>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std;

string p[1001];

string solve(int n)
{
    string a=p[n/2-1],b=p[n/2];
    int la=a.size();

    string ans="";
    ans+=‘A‘;
    int i=0;
    while(i<la){
        while(ans[i]<=‘Z‘&&ans<a) ++ans[i];
        if(ans[i]<=‘Z‘&&ans>=a&&ans<b) return ans;
        if(a[i]!=ans[i]) --ans[i];
        ans+=‘A‘;
        ++i;
    }
}

int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        for(int i=0;i<n;++i)
            cin>>p[i];
        sort(p,p+n);
        cout<<solve(n)<<endl;
    }
    return 0;
}

  

时间: 2024-12-21 04:55:35

UVA-1610 Party Games (构造)的相关文章

Uva 1610 Party Games

Thinking about it: 刚开始思考的时候,脑子里就觉得这道题可能有很多情况,刚开始就因为考虑不周全wa了. 后来换了一种思路,如果不能马上就直接得到答案,就一个一个字母去尝试.这样子就有点类似dfs了,比如 名字排序后排在中间的z字符串是 s1,,s2,那么第i位的字母肯定介于 s1[i] 和 s2[i] 之间,然后先判断在这里填一个字母能否得出答案.这里需注意:不能填了一个字母后就立马搜索下一个情况,因为题目首先要求是最短,所以要在不填下一个字母的情况下,把这个位置可能的字母都填

UVA - 1610 Party Games (字符串比较)

给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串. 紫薯上说这道题有坑,但其实思路对了就没什么坑. 很明显,只要取夹在中间两个字符串间的最小字符串就行了.可以从小到大枚举字符串的长度,如果该长度下存在满足条件的字符串则返回结果,否则把较小的字符串上对应位的字符加到末尾就行了. 因为想错思路WA了好几次,最后一次WA居然是忘了判断n=0的情况...(为什么我总是完美避开正确答案,QAQ) 1 #include<bits/st

uva 269 - Counting Patterns(构造)

题目链接:uva 269 - Counting Patterns 题目大意:给出n和k,要求找出满足的序列,要求为n元组,由-k到k组成,并且和为0.求出所有满足的元组个数,并且对于左移,右移,水平翻转,每个元素取相反数相同的视为一种,用字典序最大的表示,输出按照字典序最小的输出. 解题思路:因为表示的时候按照字典序最大的表示,一开始枚举开头的位置,那么在后面的数的绝对值就不会大于该数.最后判断一下,如果该序列不是最优的表示方法,就不是该情况. #include <cstdio> #inclu

【uva 1610】Party Games(算法效率--构造 dfs)

题意:有一个N个字符串(N≤1000,N为偶数)的集合,要求找一个长度最短的字符串(可不在集合内)S,使得集合中恰好一半的串小于等于S,另一半大于S.如果有多解,要求输出字典序最小的解. 解法:本来我是想分析情况用if else实现的,但是细节很多,特别容易错.结果果然如此.╮(╯_╰)╭ 那么便看看搜索行不行,由于要求字典序最小,也就是长度尽量小的情况下字符尽量小.而且要集合中恰好一半的串小于等于S,另一半大于S,也就是排序后>=中间靠左边的串且<中间靠右边的串.那么我们可以对排序后的中间的

Party Games UVA - 1610

#include<iostream> #include<string> #include<algorithm> using namespace std; //生成字符串 /* 求出排序后位于中间的两个字符串较小的和较大的分别为s1,s2 s[i]表示字符串s的第i位 对于第1位,显然只需要考虑两个值:s1[1],s1[1]+1 如果单独一位两种方式不能满足,则考虑2位的情况 显然,如果需要考虑第2位,那么第1位应该取s1[1] 对于第i位,如果s1[i]和s2[i]都存

UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排序,后来知道是,可是还是不会写. 既然要拼成无限大,那么只要拼的时候拼出一个环来,又由于每个是无限多的,那么可以一直重复, 就能拼起来无限大的东西,把每个正方形看成一条边,那么不就是一个拓扑排序,看看能不能找到一个环么, 如果能找到,那么就可以,找不到,就不可以.注意的是正方形可以从四面都拼,所以要

UVA - 1312 Cricket Field 构造

题目大意:在一个W * H的网格中有n棵树,要求你在这个网格中找出最大个的一个正方形,这个正方形内部不能有树,边上可以有树 解题思路:刚开始以为要暴力枚举每一个点,结果发现错了,其实这题就像UVA - 1382 Distant Galaxy这题一样,只不过这个是要找正方形,找正方形和找矩形类似,只需要取矩形的最小边就可以了 #include<cstdio> #include<algorithm> using namespace std; #define maxn 110 struc

1610 - Party Games(细节题)

不知道为什么把这道题放在高效里,我这一点也不高效的方法居然也跑了0.016s 我们需要做的很简单,挨个字符的选择,然后先加上这个字符,和所有字符串比较一遍,根据大于它和小于它的字符串个数进行判断就好了 .  注意z这个字符 ,对于某些数据,会TLE的... 没什么意思,直接看代码吧: #include<bits/stdc++.h> using namespace std; const int maxn = 10000 + 5; int n,cnt[maxn]; char ans[35],s[m

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

(白书训练计划)UVa 1605 Building for UN(构造法)

题目地址:UVa 1605 一道答案特判的题.最简单的方法是只构造两层,第一层中第i行全是i国家,第二层中第i列全是i国家.这样就保证了所有的国家都会相邻. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h&