UVa 1610 聚会游戏】的更多相关文章

https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后选择中间的两个,比较他们就可以了.可以用枚举法来比较. #include<string> #include<iostream> #include<algorithm> using namespace std; + ; string str[maxn]; int main()…
uva1610 聚会游戏(细节处理) 输入一个n(n<=1000且为偶数)个字符串的集合D,找一个长度最短的字符串(不一定要在D中出现)S,使得D中恰好一半字符串小于等于S,另一半大于S.如果有多解,输出字典序最小的解. 首先找到两个中位字符串S1和S2.显然,答案S必须夹在S1和S2之间.由于要找最短的字符串,我们可以用迭代加深的思路,根据|S|迭代加深枚举.每次枚举长度时,必须保证S的前|S|-1位和S1相同,然后最后一位枚举26个字符.这是一个贪心,应该不难证.我用了第k大数和跳过公共前缀…
题意:输入一个n(2<=n<=1000,n是偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中恰好一半串小于等于S,另一半串大于S.如果有多解,输出字典序最小的解. 分析:找到最中间的两个串,直接按位构造. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib…
游戏规则,计算机想一个单词让你猜,你每次可以猜一个字母,如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母则计算机会在一副"刽子手"画上填一笔,这幅画一共需要7笔就能完成,因此你最多只能错6次.注意猜一个已经猜过的字母也算错.在本题中,你的任务是编写一个"裁判"程序,输入单词和玩家的猜测,判断玩家赢了,(You win.).输了(You lose.).还是放弃了(You chickened out.)每组包含3行,第一行是游戏编号(-1为输入结束标记),…
UVA 11249 - Game 题目链接 题意:两堆石头.a和b.每次能取一堆随意数量,或者两堆同一时候取.可是绝对值差不能超过k,最后不能取的人输,问先手能否赢 思路:先如果(a, b)石子,a是少的一堆.首先非常easy看出(1, k + 2)是必败的,设下一个是(2, x)那么如果这个状态能到(1, k + 2)那么就是必胜,要找出(2, x)必败状态,就必定是上个状态多的一堆石子 + k + 2 - 1.这样不管怎么取.都无法变成(1, k + 2),而后手因为先手取掉了一个,就能够了…
https://vjudge.net/problem/UVA-127 题意: 按从左至右的顺序发牌,并摆成一行,发牌不要相互重叠.游戏中一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数相同,则须立即将其移动到那张牌上面.如果牌被移动后又出现了上述情况,则需再次向左移动.每叠牌只能移动最上面的一张.如果一叠牌被移空,应该立即将右边各叠整体向左移动,补上这个空隙.依次将整副牌都发完,并不断的向左合并.输出最后的牌堆数以及各牌堆的牌数. 思路: 代码虽然写着挺长,但题目很简单.用栈解决…
https://vjudge.net/problem/UVA-10891 题意: 有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取.每次玩家只能从左端或者右端取任意数量个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和,作为各自的得分.两个人采取的策略都是让自己的得分尽量高,并且两个人都足够聪明,求A的得分减去B的得分后的结果. 思路: 不管是轮到谁取数,都是在一个序列中从左边或右边开始取最大值. 那么我们就令d[i][j]表示先手在[i~j]序列中所能取到…
很简单的一个题目,就是队列的运用就可以了,就是注意一下1的时候的情况就可以了. #include<iostream> #include<queue> using namespace std; int main() { queue<int> s; int n,t; while (cin >> n && n) { ; i <= n; i++) { s.push(i); } ; ) cout << "Discarded…
题意: 给出一系列字符串,构造出一个字符串大于等于其中的一半,小于另一半. 分析: 取大小为中间的两个a,b(a<b).实际上就是找出第一个小于b的同时大于等于a的字符串,直接构造即可. 代码: #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;string a[1010];string res;int n;int…
题意: 给出一系列字符串,构造出一个最短字符串(可以不在集合中)大于等于其中的一半,小于另一半. 析:首先找出中间的两个字符串,然后暴力找出最短的字符串,满足题意. 代码如下: #include <iostream> #include <string> #include <vector> #include <algorithm> #include <cstdio> using namespace std; vector<string>…