https://vjudge.net/problem/POJ-3617 这类字符串处理字典序问题经常用到贪心, 每决定输出一个字符之前,都要前后i++,j--逐个比大小,直至比出为止. #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<cmath> #include<set>…
Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32687   Accepted: 8660 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his…
Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42701   Accepted: 10911 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges hi…
Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26670   Accepted: 7226 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Year" competition. In this contest every farmer arranges his…
Description  给定长度为n的字符串S,要构造一个长度为n的字符串T.起初,T是空串,随后反复进行下列任意操作:  1.从S的头部删除一个字符,加到T的尾部  2.从S的尾部删除一个字符,加到T的尾部  目标是构造字典序最小的字符串T(1<=n<=2000) Input  第一行为字符串长度n,之后n行每行一个字符,字符串只包含大写字母 Output  输出字典序最小的字符串T,输出时一行只能输出80个字符 Sample Input  6  A  C  D  B  C  B Samp…
原题链接:http://poj.org/problem?id=3617 问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 .起初, 是一个空串,随后反复进行下列任意操作. 从 的头部删除一个字符,加到 的尾部. 从 的尾部删除一个字符,加到 的尾部. 目的是要构造字典序尽可能小的字符串 .     限制条件: 字符串 只包含大写英文字母 输出的字符串每 80 个字符进行一次换行 字典序是指从前到后比较两个字符串大小的方法.首先比较第 1 个字符,如果不同则第 1 个字符较小的字符串…
题意:给定一行字符串,让你把它变成字典序最短,方法只有两种,要么从头部拿一个字符,要么从尾部拿一个. 析:贪心,从两边拿时,哪个小先拿哪个,如果一样,接着往下比较,要么比到字符不一样,要么比完,也就是说从头部和尾部拿都一样,那么就随便拿一个了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <…
虽然这个问题很简单,但非常好,由于过程是很不错的.发展思路的比较 并鼓励人们,不像有些贪心太偏,推动穷人,但恼人 鉴于长N弦S,然后又空字符串STR.每当有两个选择 1:删S增加虚假的第一要素STR于      2:删S增加最后一个元素STR于 是的STR字典序最小 并输出 開始可能没有什么顾虑的去想 每次比較S的头和尾元素 取小的那个删除并假如STR中.可是若S的头和尾元素一样的话这种方法就不行了,由于先取头或者尾还得看他们之间的元素,这时候是倒着来还是顺着好呢?那就直接拿顺的跟倒的进行字典序…
做法网上到处都有就不说了. 这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性…. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如果两个串当前最左端的字符不相同显然选较小的. 否则,设两个剩下的串的lcp长度为x,那么两个串的第lcp+1个字符(此时必然都存在这个字符,因为我们之前在右端加了很大的哨兵)必然不同.不妨假设第一个串的第lcp+1个字符较小. 考虑先选第二个串的第1个字符的某种方案. 如果这种方案中,我们先选了第二…
其实是学习参考了算法书的代码,但仍然是我自己写的,有小差别.贪心类型. #include <iostream> using namespace std; int main() { int i,n; +]; scanf("%d",&n); ;i<n;i++) cin>>str[i]; ,e=n-; //首尾位置 ;i<n;i++) { int ts=s,te=e; <te- && str[ts]==str[te];ts++…