您的位置:首页 > 运维架构 > Shell

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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: