UVA 10152 ShellSort
2016-07-16 22:30
330 查看
UVA-10152
题意:给n个字符串以及n个目标串,每次可以把一个字符串弹到顶部,如何弹出字符串可以得到目标。解题思路:如果我们每次把位置不对的中最大的块先弹出,那么每块只要弹出 1 次就好了。所以我们只要求哪些需要弹出,弹出的顺序就是按它们在目标中的顺序从大到小。
如果一个串在一个顺序比它大的串后面,那么它必定弹出。并且它前面的比他小的都要弹出(因为它弹出后比它前面的比它小的都会在一个比它的后面)。然后找出这些串,排序。
/************************************************************************* > File Name: UVA-10152.cpp > Author: Narsh > > Created Time: 2016年07月16日 星期六 17时39分51秒 ************************************************************************/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; struct node{ string s; int x; } a[3000],c[300]; int n,m,t,z[300]; bool pd[300]; string b[300]; bool cmp(const node x,const node y) { return x.x>y.x; } int main () { scanf("%d\n",&t); while (t--) { memset(pd,true,sizeof(pd)); memset(z,0,sizeof(z)); scanf("%d\n",&n); for (int i = 1; i <= n; i++){ getline(cin,a[i].s); } for (int i = 1; i <= n; i++) getline(cin,b[i]); for (int i = 1; i <= n; i++) for (int j = 1; j <=n; j++) if (a[i].s == b[j]) a[i].x=j; m=0; for (int i = 1; i <= n; i++) { z[i] = a[i].x; if (z[i-1] > z[i]) { m++; c[m].x= a[i].x; c[m].s= a[i].s; z[i] =z[i-1]; pd[i]=false; for (int j = 1; j < i; j++) if (pd[j] && a[j].x<a[i].x ) { m++; c[m].x= a[j].x; c[m].s= a[j].s; pd[j]=false; } } } sort(c+1,c+1+m,cmp); for (int i = 1; i <= m; i++) cout<<c[i].s<<endl; printf("\n"); } }
相关文章推荐
- jq学习使用基础笔记
- shell脚本学习---nohup
- shell之lvm
- hbase的内容查询
- 使用bash on windows
- shell编程基础笔记
- linux shell 编程(一)
- linux--vim、shell(2)
- 常用到的一些Shell,总有你需要的
- linux shell exit 值
- Shell 学习(三) 数组
- Shell 学习(二) 关键字:数据类型 字符串
- adb shell查看任务栈中Activity的排列
- /bin/sh^M:bad interpreter
- 【AD】AD域Powershell批量添加用户组组织单元20160208
- shell脚本 - 自动创建用户
- 【Xcode】Shell脚本自动打包ipa加企业版签名
- 【老经验】shell命令和PHP Cron job以及tmux
- SHELL 中的重定向和管道
- shell中的大括号和小括号