解题思路:因为题目中是连续子序列,所以两个循环确定头尾,如果头大于尾,则肯定交换后小于之前数。如:54321交换后为12345。

但是我们会碰到头尾相等的。如14321,那就比较第二个和倒数第二个这里就是比较4,2。但是如果还是相等,那就通过递归,直到两个数不相等,或者一直相等。

如果前大于后,则返回1使n加一。如果前小于后或者前一直等于后,则返回0,不改变n的值。最后输出n就行。整体思路就是这样。

注意事项:我的代码可能不够简便。希望大家提意见。

参考代码:

#include<stdio.h>

#include<stdlib.h>

int dg(char x[],int n)

{

    int i=0;

    if(n<=0)

    {

        return 0;

    }

    if(x[i]>x[n])

    {

        return 1;

    }

    if(x[i]==x[n])

    {

        dg(x+1,n-2);

    }

    if(x[i]<x[n])

    {

        return 0;

    }

}

int main()

{

    char *p;

    int i,j,n=0;

    p=(char*)malloc(4*5000);

    scanf("%s",&*p);

    for(i=0;p[i]!='\0';i++)

    {

        for(j=i+1;p[j]!='\0';j++)

        {

            if(p[i]>p[j])

            {

                n++;

            }

            if(p[i]==p[j])

            {

                if(dg(p+i,j-i))

                {

                    n++;

                }

            }

        }

    }

    printf("%d",n);

    

return 0;

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论