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

UVa 10152 - ShellSort

2013-05-07 23:06 148 查看
  题目大意:给一个栈,从上到下可以表示成一个序列,可以对其进行如下操作:将其中一个元素移到顶部。给你一个初始序列和目的序列,求让初始序列变为目的序列的最小操作次数,给出一个可能的操作步骤。

  将目的序列从0到n-1进行编号,然后按这个<字符串,号码>元组对初始序列编号,得到一个序列s,对序列s从右向左扫描,找出从n-1开始的递减序列(递减值为1),将不在这个递减序列里的数剔除出来并排序,从大到小输出编号对应的字符串就行。代码如下:

View Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 200+10;
char name[maxn][90];

int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
int K, n;
scanf("%d", &K);
while (K--)
{
scanf("%d", &n);
getchar();
for(int i = 0; i < n; i++)
gets(name[i]);
int order[maxn], index[maxn];
char s[90];
for(int i = 0; i < n; i++)
{
gets(s);
for(int j = 0; j < n; j++)
if(strcmp(s, name[j]) == 0)
{
order[j] = i;
index[i] = j;
break;
}
}
int p = n-1;
int len = 0;
int drop[maxn];
for(int i = n-1; i >= 0; i--)
{
if(order[i] == p)   p--;
else   drop[len++] = order[i];
}
sort(drop, drop+len);
for(int i = len-1; i >= 0; i--)
{
printf("%s\n", name[index[drop[i]]]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: