hdu1106&&nefu872

    作为一个初识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;
}




你可能感兴趣的:(源码,ACM)