UVA 10152-ShellSort(映射+栈)
题意: 给出一堆乌龟名字,乌龟能从本身位置爬到顶端。 要求求出从原本的顺序到目标顺序的最小操作。输出每次操作移到顶端的乌龟的名字。
解析:名字用映射对应编号,把目标状态的乌龟从上到下的编号按1到N编好,从最底端开始扫初始状态的元素,如果与右边栈底指针指的元素编号相等,则两方的指针都加1,否则把初始状态的那个元素抽出来,而另一方的指针不变。最后把抽出来的元素按从大到小的顺序排一遍,因为编号大的先被放到顶端,后来就会被小的覆盖。输出即可。
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
map<string,int> ma;
string org[205],target[205];
int le_id[205],ri_id[205]; //分别表示初始状态和目标状态
bool cmp(const int& a,const int& b){ return a>b; }
int main()
{
int T;
cin>>T;
while(T--)
{
int N;
cin>>N;
getchar();
ma.clear();
for(int i=0;i<N;i++) getline(cin,org[i]);
for(int i=0;i<N;i++)
{
getline(cin,target[i]); // 映射编号
ma[target[i]]=i;
ri_id[i]=i;
}
for(int i=0;i<N;i++) le_id[i]=ma[org[i]]; // 初始状态编号
vector<int> save;
int walk=N-1;
for(int tail=N-1;tail>=0;tail--)
{
if(le_id[tail]==ri_id[walk]) walk--; //比较,如果相等
else save.push_back(le_id[tail]); //不相等则抽出来
}
sort(save.begin(),save.end(),cmp); //排序
for(int i=0;i<save.size();i++) cout<<target[save[i]]<<endl; //输出
cout<<endl;
}
return 0;
}
UVA 10152-ShellSort(映射+栈)的更多相关文章
- uva 10152 ShellSort
//这个算法用到了"相对位置"的思想,并且就本题而言还有一个很重要的结论就是,假设 //移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知, //越先移动 ...
- uva 10152 ShellSort 龟壳排序(希尔排序?)
今天状态总是很糟,这种题目卡了一天... 是不是休息时间太少了,头脑迟钝了... 名字叫希尔排序,我还以为跟它有关,还搜索了下资料. 只要找到trick就会发现是很水的题目.只要对比下就能找到哪些是移 ...
- UVa 156 (映射 map)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 514 Rails(经典栈)
Rails There is a famous railway station in PopPush City. Country there is incredibly hilly. The st ...
- UVA 673 Parentheses Balance (栈)
题意描述: 给出一段只包含()和[]的字符串,判断是否合法,合法输出YES,不合法输出NO 规则: 1.该串为空,则合法 2.若A合法,B合法,则AB合法 3.若A合法,则(A)和[A]均合法 解题思 ...
- UVa 514 Rails(栈的应用)
题目链接: https://cn.vjudge.net/problem/UVA-514 /* 问题 输入猜测出栈顺序,如果可能输出Yes,否则输出No 解题思路 貌似没有直接可以判定的方法,紫书上给出 ...
- UVA ~ 514 ~ Rails (栈)
参考:https://blog.csdn.net/ZscDst/article/details/80266639 #include <iostream> #include <cstd ...
- UVA Stacks of Flapjacks 栈排序
题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成.给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假 ...
- UVA - 514 Rails(栈模拟)
题目: 给出一个序列,问将1,2,3,4……按从小到大的顺序入栈,能否得到给出的序列. 思路: 用stack模拟就可以了. 当前的cnt如果小于a[i],就将cnt入栈,否则就判断栈顶是不是和a[i] ...
随机推荐
- poj2242
The Circumference of the Circle Time Limit: 1000 ...
- poj2739
Sum of Consec ...
- 高精度快速幂(Java版)
import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class Main { pu ...
- 打印log 保存log
using UnityEngine; using System.Collections; using System.IO; using System; using System.Text; names ...
- [Firmware Warn]: GHES: Failed to read error status block address for hardware error source
Firmware Warn 问题描述: 系统版本:Ubuntu 12.04 LTS. 系统启动后dmesg打印大量Firmware Warn告警信息到syslog文件中.信息如下: [Firmware ...
- Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
原因oracle 11g中安装的Oracle SQL Developer是32位的,而我们现在给他指定的java.exe却是64位的,所以会出现这种错误.解决方法1)从网上下载Oracle SQL D ...
- Mysql 复制表结构 及其表的内容
顺便转一下Mysql复制表结构.表数据的方法: 1.复制表结构及数据到新表CREATE TABLE 新表 SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们 ...
- Unity-视图操作
按下 F 键使画面的视角移动到被选中对象的正面 视图场景摄像机(14年的时候,这个操作弄的头晕--) 旋转:Alt(Command)+左键拖拽 平移:Alt+Ctrl(Command)+左键拖拽 旋转 ...
- Android 6.0 闪光灯的使用
Android6.0 已经抛弃了Camer 相关的API,改用新的API接口CamerManager,下面给出使用的简单实例 package com.inper.duqiang.slashlight; ...
- c++设计模式之策略模式
概念:通过定义一系列封装的算法,使得调度者可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 特点: 1)根据不同的情况创建不同的对象. 2)每个对象的方法名相同,但实现却不同. 结构: 1 ...