(HDU)1004 -- Let the Balloon Rise(让气球飞)

问题描述
比赛时间到啦ヾ(゚∀゚ゞ)! 看到气球漂浮起来是多么鸡冻激动的事情~ 但是告诉你一个秘密,评委们最喜欢猜测哪个问题最受欢迎。 当比赛结束后,他们会计算每种颜色的气球数量,并找到结果。今年,他们决定把这个可爱的工作交给你。

 

输入
输入包含多个测试用例。 每个测试用例以数字N(0 <N <= 1000)开始—— 表示气球的总数。 接下来的N行每行各包含一种颜色。 气球的颜色是最多含有15个小写字母的字符串。

当N测试用例为N=0表示终止输入,并且不会处理此测试用例。
 

输出
对于每种情况,在一行上输出最受欢迎问题的气球的颜色。 保证每个测试用例有唯一的解决方案。
 

样例输入

5
green
red
blue
red
red
3
pink
orange
pink
0

样例输出

red
pink
点我查看问题

首先把n个输入颜色存入数组,再用一个对应数组表示这n个颜色处理值,需要遍历两遍。

假设第一次我们的数组得到的结果是这样的:

n123456
colorblackblackredorangeorangeorange
num000000

第一个循环把color数组的字符串都输入好,

接下来第二个循环从第2个字符串开始,统计前面的字符串是否和它相同,相同一次则对应num+=1;

处理完了red的时候,表格是这样的:

n123456
colorblackblackredorangeorangeorange
num010000

处理完最后一个orange,表格是这样的:

n123456
colorblackblackredorangeorangeorange
num010012

 最后对这n个num进行统计,得出num的最大值位于n的哪个值处。

示例是n=6时num最大,输出对应的颜色orange,记得换行。

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int i,j,n,num[1000],max,t;
 9     char color[1000][16];
10     while(scanf("%d",&n)!=EOF)
11     {
12         if(n)
13         {
14             num[0]=0;
15             scanf("%s",color[0]);
16             for(i=1;i<n;i++)
17             {
18                 num[i]=0;
19                 scanf("%s",color[i]);
20                 for(j=0;j<=i-1;j++)
21                 {
22                     if(strcmp(color[i],color[j])==0)
23                         num[i]+=1;
24                 }
25             }
26             max=0;
27             t=0;
28             for(i=1;i<n;i++)
29             {
30                 if(max<num[i])
31                 {
32                     max=num[i];
33                 t=i;
34                 }
35             }
36             printf("%s\n",color[t]);
37         }
38     }
39     return 0;
40 }
示例代码(C++)

代码改进一,用结构体,将num和color对应起来。

代码改进二,将每个num值初始化为1,这样最后得到的结果可以知道颜色最多出现了几次。

 

思考:如果这题最后需要将颜色按照出现次数由少到多输出,并且输出每个颜色出现的次数怎么办?

修改上述代码有点麻烦,于是换一种思考的方式。

同样需要两个数组color和num(或者结构体)来实现,

额外使用一个temp数组来缓存处理,一个kind的int变量来计算颜色种类。

1.声明时初始化所有num数组值为0,kind的值为0;

2.用strcpy函数将color[0]赋值为'null';(头文件要有string)

3.经过上面的处理后,表格是这样的:(同样使用上面的例子)

kind0      
colornull待处理待处理待处理待处理待处理待处理
num0000000

4.对于这n个气球,单个循环处理:
  将气球颜色输入到temp,用strcmp函数判断temp字符串和已知的color[i]字符串是否相同。(i=0;i<=kind;i++)

  如果相同——对应的num[i]+=1,直接跳出内循环,节省时间处理下一个气球;

  如果不同——注意是在内循环结束之后,kind+=1;color[kind]=temp;num[kind]+=1;

 

之前的例子n=6 black black red orange orange orange

处理到1的时候表格是这样的:

kind01     
colornullblack待处理待处理待处理待处理待处理
num0100000

处理到2的时候表格是这样的:

kind01     
colornullblack待处理待处理待处理待处理待处理
num0200000

处理到3的时候表格是这样的:

kind01 2    
colornullblackred待处理待处理待处理待处理
num0210000

处理到6的时候表格是这样的:

kind01 2   
colornullblackredorange待处理待处理待处理
num0213000

5.每个数据处理完后,我们知道了颜色的种类有kind种,对应名字是color[kind],对应数量是num[kind]。后面的处理可以省略了...

 

这道题保证了出现的次数不相同,可以修改一下,要求颜色出现次数相同的时候,按照字典序排列,其实也没差多少啦。

转载于:https://www.cnblogs.com/ACDoge/p/6118681.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值