解题思路:因为题目中是连续子序列,所以两个循环确定头尾,如果头大于尾,则肯定交换后小于之前数。如: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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复