左嘉


私信TA

用户名:zuojia

访问量:82657

签 名:

Jz

等  级
排  名 4
经  验 33594
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

解题思路:
每种颜色都对应有其票数,可定义颜色结构:包含数据成员颜色单词(词组)和获得的投票数;色盲的人数不多于1000个,每人一句话,最多有1000种不同的颜色,组成可查询的颜色表;输入n后可以读取随后的n句话,每句话包含颜色单词(词组)、换行符和结束符,最长不超过22个字符,删掉换行符后,单词(词组)可用来查颜色表,若颜色表中已有该单词(词组),就可以为它投票,并记录最多的票数后,结束查找;若单词(词组)还不在颜色表中,就将其新增到颜色表,并设置票数为一,表长度加一;所有的数据都输入并处理后,得到”最多票数“,再查颜色表,取得票数最多的颜色,组成票数最多颜色表,用快速排序,通过比较颜色单词(词组),排成字典序输出。

注意事项:
颜色单词包含小写字母或者空格,可以是词组,最好用fgets来读取,去掉换行符后,才可以用来查颜色表。

参考代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct SColor{
    char w[21];
    int v;
}Color;
Color color[1000],mcolor[1000];//最多1000种不同的颜色
int main(){
    int y(const void *,const void *);
    char t[22];
    int i,j,l,c,n,mc,mv=1;
    scanf("%d\n",&n);//这里先读取'\n'防止被fgets获取到
    for(c=i=0;i<n;i++){
        fgets(t,22,stdin);//每个字符串后面多了'\n'
        l=strlen(t);
        if(t[l-1]=='\n') t[l-1]='\0';//去掉无关字符
        for(j=0;j<c;j++){//查颜色表
            if(strcmp(t,color[j].w)==0){//匹配颜色单词
                color[j].v++;//为颜色投票
                if(color[j].v>mv) mv=color[j].v;//记录最多票数
                break;//已找到,不再找
            }
        }
        if(j==c){//颜色表中还没有单词t
            strcpy(color[c].w,t);//将单词t加入颜色表
            color[c].v=1;//票数为1
            c++;//颜色表的单词数
        }
    }
    for(mc=i=0;i<c;i++){//查颜色表
        if(color[i].v==mv){//取得票数最多的颜色
            strcpy(mcolor[mc].w,color[i].w);//组成票数最多颜色表
            mc++;//票数最多颜色表的单词数
        }
    }
    qsort(mcolor,mc,sizeof(Color),y);//字典序
    for(i=0;i<mc;i++) puts(mcolor[i].w);
    return 0;
}
int y(const void *a,const void *b){
    Color *ca=(Color *)a;
    Color *cb=(Color *)b;
    return strcmp(ca->w,cb->w);//比较颜色单词,排成字典序
}


 

0.0分

2 人评分

  评论区