作为一个初识ACM的大一ACMer写的博客,希望多包涵,其实第一回应该写KMP,但是自我感觉没有什么独特的见解,所以先从排序开始。今天终于给nefu_872A了,已经两天了,因为cmp函数中strcmp少了一个返回值A了很长时间,因此,给出自己一些见解,望指正,其实,hdu_1106和nefu_872题面相似,但是hdu是转换为数字排序,而nefu则是运用cmp函数进行字符串比较。因此可以先做hdu1106,hdu1106是很水的一个题,多注意一些特殊情况,最后一个数不要有空格避免PE,用冒泡,选择或则快排进行排序就可A掉,其实都用sort。下面说nefu这个题最大的不同就是拆开的数的大小,long long溢出,因此考察的是字符串比较。一样的方法,只不过建立一个结构体,其中含有两个字符串数组,一个存带前面‘0’的,一个存处理后的。再写一个cmp函数进行比较,就可A掉。下面附上源码(hdu和nefu都能A)
代码:
#include <iostream> #include<algorithm> #include<string.h> #include<stdio.h> using namespace std; struct num { char jia[105]; char name[105]; }n[1005]; int cmp(num m,num n) { if(strlen(m.name)==strlen(n.name)) { if(strcmp(m.name,n.name)==1||strcmp(m.name,n.name)==0) //一定不要忘strcmp为0时,否则TLE(TLE11回) return 0; else if(strcmp(m.name,n.name)==-1) return 1; } return strlen(m.name)<strlen(n.name); } int main() { char str[1005]; int i,j,c,flag; while(scanf("%s",str)!=EOF) { for(i=0;i<1005;i++) { memset(n[i].name,0,sizeof(n[i].name)); memset(n[i].jia,0,sizeof(n[i].jia)); } j=c=flag=0; str[strlen(str)]='5'; for(i=0;i<strlen(str);i++) { if(str[i]=='5'&&str[i+1]!='5'&&flag) //拆的时候可以用函数strtok { j++; c=0; } else if(str[i]!='5') { flag=1; n[j].jia[c]=str[i]; c++; } } int len2; for(i=0;i<j;i++) { len2=strlen(n[i].jia); for(c=0;c<len2;c++) { if(n[i].jia[c]!='0') break; } if(c==len2) n[i].name[0]='0'; else { int z=0,y; for(y=c;y<len2;y++) { n[i].name[z]=n[i].jia[y]; z++; } } } sort(n,n+j,cmp); for(i=0;i<j;i++) { if(i!=j-1) //hdu上一定要注意最后一个数不要有空格,否则会PE printf("%s ",n[i].name); else printf("%s",n[i].name); } printf("\n"); memset(str,0,sizeof(str)); } return 0; }