uva1610 聚会游戏(细节处理)
uva1610 聚会游戏(细节处理)
输入一个n(n<=1000且为偶数)个字符串的集合D,找一个长度最短的字符串(不一定要在D中出现)S,使得D中恰好一半字符串小于等于S,另一半大于S。如果有多解,输出字典序最小的解。
首先找到两个中位字符串S1和S2。显然,答案S必须夹在S1和S2之间。由于要找最短的字符串,我们可以用迭代加深的思路,根据|S|迭代加深枚举。每次枚举长度时,必须保证S的前|S|-1位和S1相同,然后最后一位枚举26个字符。这是一个贪心,应该不难证。我用了第k大数和跳过公共前缀部分来加速。
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
const int maxn=1005;
int n;
string a[maxn], s1, s2;
void getstr(int l, int r, int ord, string &str){
if (l>=r) return;
string base=a[(l+r)>>1]; int now=l;
for (int i=l; i<r; ++i) //比base小的区间是[l,tmp)
if (a[i]<base) swap(a[i], a[now++]);
int tmp=now;
for (int i=tmp; i<r; ++i) //等于base的区间是[tmp,now)
if (a[i]==base) swap(a[i], a[now++]);
if (ord<tmp) getstr(l, tmp, ord, str);
else if (ord>=now) getstr(now, r, ord, str);
else str=a[tmp];
}
string getpre(string s1, string s2){
string s("");
if (s1.size()>s2.size()) swap(s1, s2);
for (int i=0; i<s1.size(); ++i)
if (s1[i]==s2[i]) s+=s1[i]; else break;
return s;
}
int main(){
//注意半开区间取中值的方法和闭区间不同!
while (~scanf("%d", &n)&&n){
for (int i=0; i<n; ++i) cin>>a[i];
//获取两个中位字符串 复杂度O(n|s|) s=30
getstr(0, n, n/2-1, s1); getstr(0, n, n/2, s2);
string s=getpre(s1, s2); int cur=s.size();
if (s>=s1&&s<s2){ cout<<s<<endl; continue; }
while (true){
for (char c=s[cur]; c<='Z'; ++c)
if (s+c>=s1&&s+c<s2){
cout<<s+c<<endl; goto end; }
s+=s1[cur++];
}
end:;
}
return 0;
}
uva1610 聚会游戏(细节处理)的更多相关文章
- UVA1610 PartyGame 聚会游戏(细节题)
给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S.输入保证一定有解.长度要尽量短,在此基础上字典序尽量小. 分类谈论,细节挺多的,比如'Z'. 其实直接暴就过了,没分类辣么麻烦 ...
- UVa 1610 聚会游戏
https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后 ...
- UVA - 1610 Party Games(聚会游戏)(构造)
题意:输入一个n(2<=n<=1000,n是偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中恰好一半串小于等于S,另一半串大于S.如果有多解,输出字典序最小的 ...
- Unity2D游戏开发之保卫萝卜
保卫萝卜是2D塔防游戏里边的一个经典案例,这次去开发这个游戏,我们会尽力去实现和原版一样的功能,做好我们可以处理好的每一个游戏细节(比如塔攻击的集火目标优先攻击,与自动搜索,格子的三种处理逻辑,UI的 ...
- PokemonGo:LBS游戏开发
写在前面 去吧!皮卡丘!小时候拥有一台任天堂是多少熊孩子的梦想,每个夜晚被窝里透出的微弱光线,把小小的童年带入另一个世界,家门口的鸟和狗,森林里的虫和瀑布,山洞里的超音蝠,带着小小的梦,走过一个个城市 ...
- final阶段140字评论1
1.约跑app 此次演讲增加了摄像头演示的功能,所以界面可以看得更清楚,演示的比上次完整,流畅,约跑这个项目感觉对于我们颇有使用价值,大家现在都热爱跑 ...
- 项目评价及第五周PSP的发布
5TH 各组作品ALPHA发布体会 1:俄罗斯方块组做了主要功能,这个项目我自己原来拿c语言做过一部分,感觉此游戏细节特别多,逻辑思维需要组织,以为我的水准来说,感觉做的挺好的. ...
- unity3d泰斗破坏神2----课程列表
免费 课时1:泰斗破坏神第一支预告视频 01:32免费 课时2:泰斗破坏神第二支预告视频 01:58第 1 章 : 游戏开始 用户登录 服务器选择课时3:游戏开始 用户登录 服务器选择课时4:素材介绍 ...
- cocos2dx中的层CCLayer
什么是层,层在cocos2dx里是一个能处理触摸事件的CCNode,因为它负责用户交互,因此大部分游戏细节都在这个类中完成,所以我们经常派生这个图层来完成逻辑交互代码.当然如果你的图层不需要接受交互信 ...
随机推荐
- python基础-条件语句if
if语句: if 判断条件: 执行语句 else: 执行语句 flag = Falsename = 'huipaodexiong'if name == 'python': flag = True ...
- Python基础-内置函数总结
内置函数 int('123') float() string() tuple() set() dict(name='zdd',age=18) type()#查看类型 len()#看长度,其实是元素的个 ...
- codeforces 652D D. Nested Segments(离散化+sort+树状数组)
题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- STL stl_construct.h
stl_construct.h // Filename: stl_construct.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog ...
- p2p视频点播系统开发案例――Myseelite
项目地址:http://sourceforge.net/projects/myseelite/ 1. MySee公司倡导的开源项目,目前国内功能最强大的一个开源系统. 2. 一个直播(也支持轮播.点播 ...
- ACM学习历程—SNNUOJ1132 余数之和(数论)
Description F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数.例如F(6) = 6 % 1 + 6 % ...
- DEBUG命令说明
Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须得. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...
- 使用Visual Studio进行单元测试-Part3
本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 测试覆盖率的统计 测试分组 测试Setup/TearDown 测试调试 Exception测试 代码覆盖率的统计 VS下面 ...
- jenkins pipline 用法收集
1.下载多个项目 node { stage('clone'){ dir('test1'){ checkout([$class: 'GitSCM', branches: [[name: '*/maste ...
- Logstash 2.0.0 beta2 发布,开源日志管理
Logstash 是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计. Logstash 现在是 ElasticSea ...