poj 3623 Best Cow Line, Gold(贪心)

2024-06-12 01:48
文章标签 poj 3623 best cow line gold 贪心

本文主要是介绍poj 3623 Best Cow Line, Gold(贪心),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

从旧的一串字符串中从头或者从尾取数,排列成一个新串,使得新串的字典序最小。

解题思路:

很明显,这是一个贪心,用了暴力求解。

标记两个数,l 和 r 分别表示头和尾的下标。如果头部的字典序小,那么输出头部的,如果尾部的字典序小,那么输出尾部的。如果他们两个是相同的字符,那么继续往下找,直到找到第一个不相等的,或者头下标大于等于尾下标(此时,说明字符串对称,随便输出一个),输出字典序较小所在的一侧的一个字符,一定是一个字符。(一开始直接输出一堆,自以为是个优化,结果wa死。例如数据:AABAABAAA,如果不是一个一个输出,结果是AAAABAAAB,但实际结果应该是AAAAABAAB。因为在输出的一段字符的时候,不能保证这一段字符一定是字典序最小的,妈蛋,果然还是年轻)。

哦,这题还有一个坑点:每80个字符要换一行,如果最后一行不是刚刚换过行,也要换行。

代码如下:

代码简直不是一般性的丑。。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{int n,i,j,l,r;char a[30009];while(scanf("%d",&n)==1){for(i=1; i<=n; i++){scanf(" %c",&a[i]);}a[0]='Z'+1;a[n+1]='Z'+2;l=1;r=n;int xx=0;while(l<=r){if(a[l]<a[r]){if(xx>=80){printf("\n");xx=0;}printf("%c",a[l]);xx++;l++;}else if(a[l]>a[r]){if(xx>=80){printf("\n");xx=0;}printf("%c",a[r]);xx++;r--;}else if(a[l]==a[r]){int cnt = 1;int tl = l;int tr = r;while(a[tl+1]==a[tr-1]&&tl+1<tr-1){tl++;tr--;cnt++;}if(a[l+cnt]<=a[r-cnt]){if(xx>=80){printf("\n");xx=0;}printf("%c",a[l]);xx++;l++;}else if(a[l+cnt]>a[r-cnt]){if(xx>=80){printf("\n");xx=0;}printf("%c",a[r]);xx++;r--;}}}printf("\n");}return 0;
}


这篇关于poj 3623 Best Cow Line, Gold(贪心)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052859

相关文章

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

「Debug R」如何处理Error in readLines(f) :(converted from warning) incomplete final line found on xxx...

用devtools::install_github从GitHub上安装一个R包的时候出现了报错, 报错截图如下所示: 报错 从报错内容基本上可以确定是换行符惹的祸,我将该文件传送到Linux下,用cat -A检查,发现最后一行后面没有换行符。 ^M是Windows的换行符 解决方案: 手动增加最后一行。 手动加换行 到此当前的

贪心推公式——AcWing 125. 耍杂技的牛

贪心推公式 定义 贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,希望通过局部的最优选择来得到全局最优解的算法策略。 运用情况 问题具有最优子结构,即一个问题的最优解包含其子问题的最优解。可以通过局部最优决策逐步推导到全局最优。问题的选择策略相对明确且易于计算。 注意事项 贪心算法并不总是能得到全局最优解,可能会陷入局部最优。对于一些复杂问题,需要谨慎验证其正确性。可能需要对

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看,是一个含有2个标尺的单源最短路问题,挺难处理的。 既然没法直接用最短路处理,那我们就“记录信息”,将花费的时间也记录进dp数组,然后跑“状态最短路”。 用f[i][j] 表示到达点i 且 总花费时间为j的最短距离,然后跑堆优化的dijkstra算法就好。由于不含有负边权,因此可以搞一个vis数

代码随想录第31天|贪心算法

134. 加油站 参考 思路: 以每个油站相差作为判断, 比如: gas [5 8 2 8]cost [6 5 6 6] [-1 3 -4 2] 错误 : 把相差最大点当作起点判断能否绕一圈 : 相加数组是否小于0局部最优: 当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行全局最优: 找到可以跑一圈的起始位置 class