UVA 10152 ShellSort

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");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值