题意:
给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作:
1.把s字符串第一个字符转移到t字符串最后。
2.把t字符串最后一个字符转移到u字符串最后。
最后要求s、t字符串都为空,问u字符串字典序最小能是多少。

题解:
本题实质为一个栈混洗,s为初始栈,t为中间栈,u为结果栈。
我们考虑这样的贪心策略:如果t栈为空,那么做s->t;
如果t栈不空:
对于t栈顶,如果s栈中不存在比它字典序更小的单词,就做t->u
否则做s->t

下面我来试着证明一下这个贪心的正确性
对于t栈栈顶元素x,如果已经比s栈中所有元素都小了,那么将x转入u栈一定是最优决策;
如果s栈中最小的元素和x相同,那么将x转入u栈不会让结果变得更糟(反之则有可能)
如果s栈中最小的元素小于x,应该把这个比较小的元素放到t栈中,所以做s->t

min_s【i】=x,表示第i个位子后边最小的字符是x.

AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define max 2000char min_s[100080];int main()
{string ss;while (cin >> ss){int len = ss.size();for (int i = len - 1; i >= 0; --i){if (i == len - 1)min_s[i] = ss[i];elsemin_s[i] = min(min_s[i + 1], ss[i]); //维护  位置i后边最小的字符}stack<char>t;for (int i = 0; i < len; i++){if (t.empty())  //为空的话就将一个字符读入t.push(ss[i]);else{while (!t.empty()){int u = t.top() ;if (u <= min_s[i]) //如果当前字符是比i位置后边的字符小或等于的话就可以输出了。{cout << t.top();t.pop();}else  //否则直接停止break;}t.push(ss[i]); //将这个字符压入栈}}while (!t.empty()){cout << t.top();t.pop();}cout << endl;}return 0;}

Codeforces 797C Minimal string【贪心】相关推荐

  1. CodeForces 797C Minimal string

    栈. 先处理一下后缀最小值. 对于每一个字符,如果不是后缀最小值,将栈顶小于当前后缀最小值的都弹出,然后压入当前字符. 如果是后缀最小值,将栈顶小于当前后缀最小值的都弹出,再输出该字符. #inclu ...

  2. 【CodeForces - 827A】String Reconstruction(并查集合并区间,思维)

    题干: Ivan had string s consisting of small English letters. However, his friend Julia decided to make ...

  3. 797C C. Minimal string

    贪心,后缀 思路: 逆序维护一个数组minn[i]=x,表示第i个位子后边最小的字符是x. 那么对应维护一个栈,如果此时栈顶字符小于等于minn[此时要加入的元素的位子],那么就出栈,将栈顶这个字符输 ...

  4. [cf797c]Minimal string(贪心+模拟)

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后 2.把t字符串最后一个字符转移到u字符串最后 最后要求s.t字符串都为空,问u字符 ...

  5. CodeForces - 1607D Blue-Red Permutation(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,每个数字有一个颜色,如果是蓝色,每次操作则可以减一:如果是红色,每次操作则可以加一. 问有限次操作后,能否将数组变为一个长度为 nnn 的 ...

  6. CodeForces - 1579G Minimal Coverage(dp)

    题目链接:点击查看 题目大意:给出 nnn 个长度不同的木棍.设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法: 放到 [x+1,x+a[i]][x+ ...

  7. CodeForces - 1481E Sorting Books(贪心+dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起 题目分析:不难看出,对每个位置的数都操作一次,是 ...

  8. CodeForces 176A Trading Business 贪心

    Trading Business 题目连接: http://codeforces.com/problemset/problem/176/A Description To get money for a ...

  9. 【Codeforces】158B-Taxi(贪心,怎么贪咧)

         贪心   emmmm http://codeforces.com/contest/158/problem/B 题目大意:有四种旅客,四人一组,三人一组,两人一组,一人一组,一辆出租车最多可以 ...

最新文章

  1. Fastjson反序列化漏洞研究
  2. Windows/Linux中手动添加路由
  3. 在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别
  4. 转载一篇阅读文章(还算不错吧)
  5. 算法提高 超级玛丽(java)
  6. php 增加数组下标_PHP数组排序更改下标KEY方法
  7. 数据源中没有 datarow_Power BI Desktop 中的数据源
  8. JSP的注释、表达式、注意事项
  9. 【独家】阿里云罗庆超:对象存储 OSS 海量数据管理和应用最佳实践
  10. 跑python gpu利用率低_提高GPU利用率,阿里云cGPU容器技术助力人工智能提效降本...
  11. jq正则过滤html style,Jqgrid利用正则匹配表达式正确移除html标签
  12. 用爬虫抓取新浪微博粉丝
  13. Java - IO流学习笔记
  14. 使用python Tqdm 进度条库让你的python进度可视化
  15. Activity在全屏属性情况下,WebView会出现输入法软键盘遮挡输入框(界面无法自动上调)问题
  16. PyQt5实时汇率查询
  17. Libgdx之正交相机 OrthographicCamera
  18. 人脸识别接口_人脸识别双模摄像头解析,免费搭配活体检测
  19. 记一次EFCore类型转换错误及解决方案
  20. 顺序队列模板简单应用算法设计:农夫过河(这个比较难,我自己都觉得难)

热门文章

  1. 梁云 北大 计算机,北京大学信息技术高等研究院
  2. source insight(SI)使用教程
  3. VSCODE更改文件时,提示:EACCES: permission denied的解决办法(ubuntu16.04虚拟机)
  4. web前端入门学习 css(1)
  5. jinja2 {{}} href 双大括号
  6. 【大数据、数据挖掘、数据分析】用户画像是什么?如何制作用户画像?
  7. C++ 栈和堆上建立对象的区别
  8. JAVA线程的生命周期以及5种状态转换
  9. 并发集合和普通集合以及安全集合的区别
  10. menu什么意思中文意思_proclaim什么意思