解题思路:由于每个数只要头和尾,而其中尾只能是0到9,即使当尾为0时不能继续接,也要用10个参数来储存尾巴为0到9的最大长度即可。
p[10]的1到9对应当前尾巴为1到9的长度最长的值,所以每拿到一个新的数,只要检测这个数接上去是否可以使某一个数组最大值增加。
具体表现为先提取头,然后接到尾巴为该数的数组,即对应数组+1,然后与新的数的尾巴原对应的数组进行对比,也就是p[头]+1>p[尾],
大于成立时,将尾巴对应的数组赋值为新的最大值,此时只更新了新的数尾巴对应的数组,所以原先头对应的数组不变。
说白了就是for循环每次都更新尾号0到9的最大长度就是了。
注意事项:
将数组长度要定义到10,是因为尾巴可能为0,并且用1到9对应数组时就不用加一。即使新的数尾巴为0,也要将该值进行上述更新,因为不排除长度最长时尾巴为0的情况。
参考代码:
int main(){ int n,x,a,p[10]={0}; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a); x=a%10; //x为当前该数的尾数 while(a/10)a/=10; //将a变成该数的头 if(p[a]+1>p[x])p[x]=p[a]+1; //判断该数的头对应的数组加1是否能大于该数的尾巴对应数组的长度。当尾巴为0时,长度储存在p[0] } for(int i=1;i<10;i++)if(p[i]>p[0])p[0]=p[i]; //最终将尾巴为0到9的最大值传给p[0] printf("%d",n-p[0]); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复