原题链接:蓝桥杯算法训练VIP-s01串
解题思路:
刚开始,要求s01串,不复杂,只有两种变换方式,输入数据的规模也不大,用两个数组,从一个数组里读取当前需要变换的子串,另一个数组不断往后增加变换得到的新串,就能逐步变换;可是,算法的时间和空间怎样限定呢?对空间,逐步探测,先假设串长只有1000个字符,输入n为15时,计算得到串长为987,输入n为16时,超出了1000个字符,发生段错误,再增设串长在10000个字符以内,输入n为16时,串长为1597,输入n为19时,串长为6765,未发生段错误。空间限定好以后,再看时间,这里的特别之处在于计时函数clock()的使用,函数返回自程序开始运行的处理器时间,如果无可用信息,返回-1,返回值除以CLOCKS_PER_SEC得到的值以“秒”为单位(注: 如果编译器是POSIX兼容的, CLOCKS_PER_SEC定义为1000000),输入n为19,求s01串,时间用了0.03秒,满足题目的要求。
注意事项:
每次在求变换后的新串前,都需要初始化接受新串的字符数组:sb[0]设置为'\0',这样新串才正确并不会超长。
参考代码:
#include<stdio.h> #include<string.h> #include<time.h> int main(){ int i,n; char sa[10000],sb[10000]; scanf("%d",&n); sa[0]='0';sa[1]='\0';sb[0]='\0'; //s01串初始为"0" while(n--){ //n次变换 for(i=0;sa[i]!='\0';i++){ //从a串中取出子串 if(sa[i]=='0') strcat(sb,"1"); //若为"0"就往新串后加"1" else if(sa[i]=='1') strcat(sb,"01"); //若为"1"就往新串后加"01" } strcpy(sa,sb); //为下次变换记录中间结果 sb[0]='\0'; } printf("%s\n%d\n",sa,strlen(sa)); printf("Time used = %.2lf\n",(double)clock()/CLOCKS_PER_SEC); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复