NOIP 1998 提高组 复赛 拼数
1.看了题目,发现可以按字符串读取,按字典序,由大到小排序,冒泡排序即可,字符串操作。
2.提交:竟然最后一个测试点WA。想不通啊。
3.下载了测试数据,才发现,按照目前的理解,该测试点是过不了。
4.测试数据如下:
输入:
6
321 32 407 135 13 217
输出:
4073232121713513
5.程序要大改,要根据比较的两个字符串长度进行分类讨论。
6.想到一个技巧,采用拼接的方式来决定,一个字符串是另一个字符串子串,是否交换。
321 32 32132 32321
135 13 13513 13135
7.经过修改,编了一个比较复杂的程序,提交AC.
8.翻看他人代码,怎么这么短,一读,发现正是上面6.提到的思想,马上着手修改,提交AC。
9.通过该题学到,字符串比大小比较简单的一招,如6.所述。
附上简洁代码,提交AC,编译环境Dev-C++4.9.9.2
#include <stdio.h>
#include <string.h>
char input[30][30],t[30],t2[100],t3[100];
void swap(int i,int j){
strcpy(t,input[i]);
strcpy(input[i],input[j]);
strcpy(input[j],t);
}
int main(){
int n,i,j,k,s,leni,lenj;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",input[i]);
for(i=0;i<n;i++)//按字典序,由大到小排序
for(j=i+1;j<n;j++){
strcpy(t2,input[i]);
strcat(t2,input[j]);
strcpy(t3,input[j]);
strcat(t3,input[i]);
if(strcmp(t2,t3)<0)
swap(i,j);
}
for(i=0;i<n;i++)
printf("%s",input[i]);
printf("\n");
return 0;
}
附上编写比较复杂,提交AC的代码,编译环境Dev-C++4.9.9.2
#include <stdio.h>
#include <string.h>
char input[30][30],t[30],t2[100],t3[100];
void swap(int i,int j){
strcpy(t,input[i]);
strcpy(input[i],input[j]);
strcpy(input[j],t);
}
int main(){
int n,i,j,k,s,leni,lenj;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",input[i]);
for(i=0;i<n;i++){//按字典序,由大到小排序
leni=strlen(input[i]);
for(j=i+1;j<n;j++){
lenj=strlen(input[j]);
if(leni==lenj){
if(strcmp(input[i],input[j])<0){
swap(i,j);
}
}else if(leni<lenj){
if(strcmp(input[i],input[j])>0){//什么事也不干
}else if(strcmp(input[i],input[j])<0){
k=0;
s=0;
while(k<leni&&input[i][k]==input[j][s]){
k++;
s++;
}
if(k==leni){//什么事情也不干
strcpy(t2,input[i]);
strcat(t2,input[j]);
strcpy(t3,input[j]);
strcat(t3,input[i]);
if(strcmp(t2,t3)<0){
swap(i,j);
}
}else{
swap(i,j);
}
}
}else if(leni>lenj){
if(strcmp(input[i],input[j])<0){
swap(i,j);
}else if(strcmp(input[i],input[j])>0){
k=0;
s=0;
while(s<lenj&&input[i][k]==input[j][s]){
k++;
s++;
}
if(s==lenj){
strcpy(t2,input[i]);
strcat(t2,input[j]);
strcpy(t3,input[j]);
strcat(t3,input[i]);
if(strcmp(t2,t3)<0){
swap(i,j);
}
}else{//什么事也不干
}
}
}
}
}
for(i=0;i<n;i++)
printf("%s",input[i]);
printf("\n");
return 0;
}
附上75分代码,编译环境Dev-C++4.9.9.
#include <stdio.h>
#include <string.h>
int main(){
int n,i,j;
char input[30][30],t[30];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",input[i]);
for(i=0;i<n;i++)//按字典序,由大到小排序
for(j=i+1;j<n;j++)
if(strcmp(input[i],input[j])<0){
strcpy(t,input[i]);
strcpy(input[i],input[j]);
strcpy(input[j],t);
}
for(i=0;i<n;i++)
printf("%s",input[i]);
printf("\n");
return 0;
}