晚上闲的无聊把这次13级考试题后几个敲出来了,一个是我考试没做出来猴子选大王还有一个是计算机的压轴题压缩字符串。。。猴子选大王这尼玛当时直接被坑了,算法不会,脑子一逗,推了45分钟没推出来!!!!!
回去直接恶补
之后敲出来
#include<stdio.h> int main() { int a[1000]; int m,n; int counts,begins,i,w; while(scanf("%d%d",&m,&n)!=EOF) { for(i=0;i<m;i++) //赋值为1代表没有被淘汰 a[i]=1; counts=m; begins=0; i=0; while(counts>1) { for(;a[i%m]==0;i++);//当碰到1的时候跳出 i=i%m; //控制i范围在猴子总数内 begins++; //模拟数数 if(begins==n) { begins=0; a[i]=0; //赋值成0的标号的猴子代表被淘汰 counts--; } i=(i+1)%m; } for(i=0;i<m;i++) if(a[i]==1) { printf("%d\n",i+1); //输出没有被淘汰的猴子 break; } } return 0; }
其实也没什么难得,水题。。。当时脑子抽筋了=-=。。。心里素质问题啊!!!
第二个就是计算机的压缩字符串
Description
RLE(Run- Length Encoding 行程长度编码)压缩算法是Windows 系统中使用的一种图像文件压缩方法,其基本思想是:将一扫描行中颜色值相同的相邻像素用两个字节来表示, 第一个字节是一个计数值, 用于指定像素重复的次数; 第二个字节是具体像素的值。主要通过压缩除掉数据中的冗余字节或字节中的冗余位,从而达到减少文件所占空间的目的。例如, 有一表示颜色像素值的字符串RRRRRGGBBBBBB,用 RLE 压缩方法压缩后可用 5R2G6B 来代替,显然后者的串长度比前者的串长度小得多。译码时按照与编码时采用的相同规则进行,还原后得到的数据与压缩前的数据完全相同。因此,RLE 是无损压缩技术。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OK,你的任务来了:对输入的一个字符串使用RLE进行压缩,或者对一个使用RLE压缩的串进行解压缩。编写如下两个函数:
1. char *decode(char *dest, char *source);
用于对字符串进行解压缩。其中source是需要进行解压缩的串,dest是解压缩之后的串。返回值为解压缩串的首字符地址。
2. char *encode(char *dest, char *source);
用于对字符串进行压缩。其中source是需要进行压缩的串,dest是压缩之后的串。返回值为压缩串的首字符地址。
注意:提交时相关的预处理命令也要提交。
Input
输入有多行,至EOF结束。
每行输入含有2部分:第一个是1或者0。如果是1,表示后面一个待压缩的字符串,需要你对该串进行压缩。如果是0,表示后面是一个压缩后的字符串,需要进行解压缩。第2部分是一个不含空白符且由至多10000个字符组成的字符串。
假定需要压缩的串或者解压缩后的串中仅由26个英文字符组成。
Output
每行输入对应一行输出。输出结果是对相应输入进行压缩或者解压缩之后的结果。
Sample Input
1 aaaaabbeecccdddd 0 8a13b
Sample Output
5a2b2e3c4d aaaaaaaabbbbbbbbbbbbb
借别人账号上去看的原题,没有后台测试数据所以不知道对不对,不过测试了几组数据,都对,也没什么难得,就是麻烦(至少我的方法比较麻烦)就将字符串的数字和字符全部提取出来
用sscanf和sprint反复导就行了
不多说,直接上代码:
#include<stdio.h> #include<string.h> #define MAX_STR_LEN 10010 char *decode(char *dest, char *source) { int L=strlen(source); char x[MAX_STR_LEN][5]; //储存数字 char y[MAX_STR_LEN]; //储存字符 int sum[MAX_STR_LEN]; int i,j,k,w; for(i=0,j=0,k=0;i<L;i++) { if(source[i]>='0'&&source[i]<='9') { x[k][j]=source[i]; j++; } else if(isalpha(source[i])) { x[k][j]='\0'; y[k]=source[i]; k++; j=0; } } for(i=0;i<k;i++) sscanf(x[i],"%d",&sum[i]); j=0; for(i=0;i<k;i++) { for(w=0;w<sum[i];w++,j++) dest[j]=y[i]; } dest[j]='\0'; return dest; } char *encode(char *dest, char *source) { int L=strlen(source); int sum[MAX_STR_LEN]={0}; char x[MAX_STR_LEN]; char y[MAX_STR_LEN]; int i,j,k; x[0]=source[0]; sum[0]=1; for(i=1,j=0;i<L;i++) { if(source[i]==source[i-1]) { sum[j]++; } else { j++; x[j]=source[i]; sum[j]++; } } for(i=0;i<=j;i++) { y[0]=sum[i]+'0'; y[1]=x[i]; y[2]='\0'; strcat(dest,y); } return dest; } int main() { char dest[MAX_STR_LEN],source[MAX_STR_LEN]; int flag; while(scanf("%d",&flag)!=EOF) { getchar(); gets(source); if (flag == 1) encode(dest,source); else decode(dest,source); puts(dest); } return 0; }
还有就是计算机的K题,亲和数减小时间复杂度问题,一开始做总是TL80%后来问了一下才知道素检测到sqrt(n)就行了。。。无语了、、、这次考试总结没别的,心理素质不够硬,方法太糙了,还是练得少 。
明天工数考试,祝我低空飞过吧=-=。。。工数这玩意真没抱太大期望。。。
加油