zoukankan      html  css  js  c++  java
  • 简单字符串处理 hdu2532 Engine

    本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧。

    首先分析下题目思路:

    这个题目是个模拟题,步骤也很清晰。

    首先需要每行读入,将论文的名字,序号,与被引数放到一个结构体里,同时需要一步处理:将文章名称分为关键字存储。

    然后程序进行一次排序,以被引数为第一关键字,以号数为第二关键字排序。

    排序之后,按照类似方式读入查询命令,将查询命令分为不同关键字,将这些关键字挨着与论文关键字比较,相同即可输出。

    按照这些步骤就可以写出靠谱的代码了,结果我还是wa了三次。。

    先上代码,收获就放后面,可忽略。。

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 typedef struct record
      5 {
      6     int num;
      7     int count;
      8     int keyL;
      9     char name[300];
     10     char afname[300];
     11     char key[11][21];
     12 }Record;
     13 Record rec[1001];
     14 Record qy;
     15 int divide(char a[],char b[11][21],int n)
     16 {
     17     int cur=0,j=0;
     18     for(int i=0;i<n;i++)
     19     {
     20         if(a[i]==' ')
     21         {cur++;j=0;}
     22         else
     23             b[cur][j++]=a[i];
     24     }
     25     return cur+1;
     26 }
     27 int cmp(const void *a,const void *b)
     28 {
     29     Record c = *(Record *)a;
     30     Record d = *(Record *)b;
     31     if(c.count==d.count)
     32         return c.num - d.num;
     33     else return d.count - c.count;//优先按coun排序,大的在前
     34 }
     35 
     36 int match(char qry[11][21],char tar[11][21],int qn,int tn)
     37 {
     38     int num=0;
     39     for(int x=0;x<qn;x++)
     40     {
     41         for(int y=0;y<tn;y++)
     42             if(strcmp(qry[x],tar[y])==0)
     43             {
     44                 num++;
     45                 break;
     46             }
     47     }
     48     if(num==qn)
     49         return 1;
     50     else
     51         return 0;
     52 }
     53 
     54 void init(char a[],int n,char b[])
     55 {
     56     for(int ii=0;ii<n;ii++)
     57     {
     58         if(a[ii]<='Z'&&a[ii]>='A')
     59             {
     60              b[ii]=char(a[ii]+32);
     61             }
     62         else
     63             b[ii]=a[ii];
     64     }
     65 
     66 }
     67 int main()
     68 {
     69     int T,i;
     70     while(scanf("%d",&T))
     71     {
     72         if(T==0)break;
     73         memset(rec,0,sizeof(Record)*T);
     74         getchar();
     75         for(i=0;i<T;i++)
     76         {
     77             gets(rec[i].name);
     78             init(rec[i].name,strlen(rec[i].name),rec[i].afname);
     79             scanf("%d",&rec[i].count);
     80             getchar();
     81             rec[i].keyL=divide(rec[i].afname,rec[i].key,strlen(rec[i].name));
     82             rec[i].num=i+1;
     83         }
     84         qsort(rec,T,sizeof(Record),cmp);
     85         int k;
     86         scanf("%d",&k);getchar();
     87         for(i=0;i<k;i++)
     88         {
     89             memset(&qy,0,sizeof(Record));
     90             gets(qy.name);
     91             init(qy.name,strlen(qy.name),qy.afname);
     92             qy.keyL=divide(qy.afname,qy.key,strlen(qy.name));
     93             for(int j=0;j<T;j++)
     94             {
     95                 if(match(qy.key,rec[j].key,qy.keyL,rec[j].keyL))
     96                 {
     97                     puts(rec[j].name);
     98                 }
     99             }
    100             printf("***
    ");
    101         }
    102         printf("---
    ");
    103     }
    104     return 0;
    105 }
    hdu 2532

    代码方面这是第一次全用C写的结构体+重载比较函数构成的多关键字排序,(之前常用C++),

    第一次碰到读入一行的问题,解决方法是在用scanf读入之后,要用getchar+gets配合,

    第一次处理memset多组初始化问题memset(rec,0,sizeof(Record)*T);+memset(&qy,0,sizeof(Record));配合使用。

    其他的一些辅助函数用来模拟的就不值一提了。

    非代码方面,这题大体思路昨晚已经有了,但wa了两次,在不知道错误原因的情况下担心wa之后是TLE,所以当时有点心灰意冷,其实最近也一直很忐忑,面试的通知一直没下来,今天妹妹升学宴又出去一天,可晚上回来没想到只用了半小时就调了两个bug出来,而且A了这个少有人问津的题目。虽然心中依然忐忑,依然对未知的错误充满恐惧,但是我相信会好起来的。

    ---一个事情,自己找不到原因,非常可怕。

  • 相关阅读:
    敏捷个人手机应用:如何下载敏捷个人资料
    2014年8月10日:敏捷个人奥森跑步+慢走分享
    敏捷个人手机应用:如何进行敏捷个人练习
    敏捷个人新体系:定位
    任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
    亲密爱人:《亲密关系》读书笔记
    亲密爱人:《亲密关系
    2014.7.12 敏捷个人奥森健步走&敏友分享会.活动报道
    开放产品开发(OPD):产品负责人的工作原则和方法
    #敏捷个人资料# 免费下载 《敏捷个人-认识自我,管理自我 v0.8.pdf》
  • 原文地址:https://www.cnblogs.com/holyprince/p/3283681.html
Copyright © 2011-2022 走看看