题解:ABC276C - Previous Permutation

题解:ABC276C - Previous Permutation

·题目

链接:Atcoder。

链接:洛谷。

·难度

算法难度:入门。

思维难度:普及。

调码难度:入门。

综合评价:简单。

·算法

数论。

·思路

找规律过程概不赘述,此处直接说结论:

从后往前,找到最长的一个严格递增子串且保证该子串最后一个点位置为n,在该子串前紧邻的元素位置记作id。由于id项不属于该严格递增子串,所以id项一定大于id+1项。在该严格递增子串中,找到一个元素,为在该严格子串中小于id项的最大的一项,其位置记作x。将id项和x项交换位置,并把从id+1项到n项从大到小排序,操作过后的序列就是答案。

·代价

O(n),可以AC。

·细节

对于位置查询,直接暴力枚举即可。

·代码

#include
#define N 110
using namespace std;
int p[N]={},n=0;
bool cmp(int a,int b);
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&p[i]);
    }
    int id=0;
    for(int i=n-1;i>=1;i--){
        if(p[i]>p[i+1]){
            id=i;
            break;
        }
    }
    int x=n;
    for(int i=id+1;i<=n;i++){
        if(p[i]>p[id]){
            x=i-1;
            break;
        }
    }
    swap(p[id],p[x]);
    sort(p+id+1,p+n+1,cmp);
    for(int i=1;i<=n;i++){
        printf("%d%c",p[i]," \n"[i==n]);
    }
    return 0;
}
bool cmp(int a,int b){
    return a>b;
}

·注意

在printf那一行中\n"[i==n]\n"为一个字符串,当i==n成立时该表达式值为1,返回字符串第1项(从0记起)空格,否则返回0,返回第0项回车。

你可能感兴趣的:(算法,c++,开发语言)