UVA 10152 - ShellSort

题目大意:

输入第一行表示总共的测试组数n。每一组中的第一行表示本组的数据个数m,而后m行每一行是一个数据名称,以栈的方式,先出现的在栈顶,后出现的在栈底

表示初始状态,再后m行也是每行一个数据名称,先出现的在栈顶,后出现的在栈底 ,表示目标状态

允许的操作:将栈中的某一个元素移至栈顶,并且其它元素相对位置不变

要求:求从初始状态到目标状态所需的最少操作

输出: 如果有多解任意一组都行,对于一组解依次输出每次移动元素的名称,且每个元素名称独占一行,每组数据(注意是每组数据都要如此)后都需要有一额外的空行。


算法:

1.给每个数据标号,即依照目标状态 , 从栈顶都栈底依次为0,1,...n-1

2.依照上面的标号,按从栈顶到栈底的顺序扫描一遍初始状态,寻找满足以下条件的最大标号k

    即满足在扫描到它之前出现过比它标号大的元素。

3.依次输出标号为k , k-1 , ...0元素对应的名字。

#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

int main()
{
	int n;
	cin >> n;
	for(int i = 0 ; i < n ; ++i)
	{
		int m;
		cin >> m;  getchar();
		string str;
		vector<string> v1 , v2;
 		for(int j = 0 ; j < m ; ++j)
		{
			getline(cin , str);
			v1.push_back(str);
		}
		
		map< string , int > u;
		for(int j = 0 ; j < m ; ++j)
		{
			getline(cin , str);
			v2.push_back(str);
			u.insert(make_pair(str , j));
		}
		
		int p = -1 , q = -1;
		for(int j = 0 ; j < m ; ++j)
		{
			int t = u.find(v1[j])->second;
			if(t>p) p = t;
			else if(t > q) q = t;
		}
		for(int j = q ; j >= 0 ; --j)
			cout << v2[j] << endl;
		cout <<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值