排列 POJ

来源:互联网 发布:mac版金蝶友商智慧记 编辑:程序博客网 时间:2024/06/06 02:48

题目地址:POJ-1833


/*当序列递减的时候才是最大所以,先从后往前找到一个 s[n]<s[n+1]的n点然后在n+1后面的点找一个s[k]<s[n+1]&&s[k]>s[n]的s[k]值最小的k点 k点与n交换如果找不到则n点与n+1点交换对n点以后的序列排序*/#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int num[1200];int n,k;void reverse(){    int mid=n/2,t;    for(int i=0;i<mid;i++){        t=num[i];        num[i]=num[n-1-i];        num[n-1-i]=t;    }}int main() {    int N,i,x,y,MIN;    scanf("%d",&N);    while(N--) {        scanf("%d %d",&n,&k);        for(i=0; i<n; i++)            scanf("%d",&num[i]);        int p=0;        while(1) {            p++;            if(p>k)break;            x=-1,y=-1,MIN=2000;            for(int i=n-2; i>=0; i--)                if(num[i]<num[i+1]) {                    x=i;                    for(int j=i+2; j<n; j++) {                        if(num[j]<num[i+1]&&num[j]>num[i]&&MIN>num[j]) {                            MIN=num[j];                            y=j;                        }                    }                    break;                }            if(x!=-1&&y==-1){                int t=num[x+1];                num[x+1]=num[x];                num[x]=t;            }else if(x!=-1&&y!=-1){                int t=num[y];                num[y]=num[x];                num[x]=t;            }            sort(num+x+1,num+n);        }        for(i=0;i<n-1;i++)        printf("%d ",num[i]);        printf("%d\n",num[i]);    }    return 0;}


0 0
原创粉丝点击