NOIP 1998 提高组 复赛 拼数

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值