3128. 十进制数列项

风见幽香

next_permutation是个好东西

#include<bits/stdc++.h>
using namespace std;
int t,n,c;
int main()
{
    cin>>t;
    string str;
    for(c=0;c<t;c++)
    {
        cin>>str;
        if(is_sorted(str.begin(),str.end(),greater<char>()))str="0"+str;
        next_permutation(str.begin(),str.end());
        printf("case #%d:\n%s\n",c,str.c_str());
    }
}
10185102112

md辛辛苦苦写了之后,发现这个函数,不是作弊吗

爱丽丝_青贝尔克

STL里居然还有这种函数。。感谢分享

10175102262 LarsPendragon

思路:
1. 不管怎样先在数字的开头加一个0
2. 找从右向左第一个“下降数”
3. 交换这个数与它右边数中大于它的数中的最小数
4. 将它右边的数从小到大排列
5. 输出
附C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void*a, const void*b)
{
    char *p1=(char*)a, *p2=(char*)b;
    return *p1-*p2;
}
int main()
{
    int T, I;
    scanf("%d",&T);
    for(I=0; I<T; I++)
    {
        char s[25], store[20];
        int i, j, cnt=0, l;
        scanf("%s",s+1);
        s[0]='0';
        l=strlen(s);
        for(i=l-1; i+1; i--) if(s[i]>s[i-1]) break;
        for(j=l-1; j>=i; j--) store[cnt++]=s[j];
        qsort(store, cnt, sizeof(char), cmp);
        for(j=0; j<cnt; j++) if(store[j]>s[i-1]) break;
        s[i-1]^=store[j];
        store[j]^=s[i-1];
        s[i-1]^=store[j];
        qsort(store, cnt, sizeof(char), cmp);
        for(j=0; j<i; j++) if(s[j]!='0') break;
        printf("case #%d:\n",I);
        for(; j<i; j++) printf("%c",s[j]);
        for(j=0; j<cnt; j++) printf("%c",store[j]);
        printf("\n");
    }
    return 0;
}
欢迎访问我的主页!http://godweiyang.com

康托展开搞一发啊: * 求n个数的第k个排列 * 求n个数的某个排列在所有排列中的次序

Master X

stl全排列笑而不语

你当前正在回复 博客/题目
存在问题!