Problem Description

Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges' favorite time is guessing the most popular problem. When the contest is over, they will count the balloons of each color and find the result.

This year, they decide to leave this lovely job to you.

又是比赛时间!看见气球漂浮着是多么激动人心啊。但是告诉你一个秘密,裁判最喜欢的时间是才最受欢迎的问题。当比赛结束时,他们会数出每种颜色的气球然后得出结果。

今年,他们决定把这项可爱的工作留给你。

(注:好像ACM的标志就是气球)

Input

Input contains multiple test cases. Each test case starts with a number N (0 < N <= 1000) -- the total number of balloons distributed. The next N lines contain one color each. The color of a balloon is a string of up to 15 lower-case letters.

A test case with N = 0 terminates the input and this test case is not to be processed.

输入包含多组测试数据。每组数据以N(0 < N <= 1000)开始——放飞的气球总数。下面的N行各描述一个颜色。一个气球的颜色是一个最多有15个小写字母的字符串。

一组N为0的测试数据表示停止输入,并且这组数据不应被处理。

Output

For each case, print the color of balloon for the most popular problem on a single line. It is guaranteed that there is a unique solution for each test case.

对于每一组数据,使用一整行输出最热门的问题的气球的颜色。保证每组问题的解是唯一的。

分析

输入N个字符串,求出现次数最多的字符串。方法多种多样。

但是要注意:

1. N的范围是0<N<=1000,因此N也可以是1或2,如果是这样可以直接输出任意一个颜色(都是一样的)。因为N=1时,输入的就是出现最多的;N=2时,因为有唯一解,所以任意选一个输出。否则容易造成access violation。

2. 如果用char数组存储字符串,注意数组大小是[1000][16]而不是[16][1000],否则100%会造成access violation。

方法1

先输入全部字符串,然后按照字典顺序排序(C用qsort(),C++用sort())。从第一个一直检查到最后一个,看哪个出现的最多。

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h> int cmp(const void *a, const void *b); int main()
{
int n;
char c[][]; // Not c[16][1000]!!!
while (scanf("%d", &n), n != )
{
int i;
for (i = ; i < n; i++)
scanf("%s", c[i]);
if (n == || n == )
{
printf("%s\n", c[]);
continue;
}
qsort(c, n, sizeof(c[]), cmp);
int ct = ;
int mx = ;
char * p;
for (i = ; i < n; i++)
{
if (strcmp(c[i], c[i - ]) == ) // Use strcmp() instead of == to compare two strings
ct++;
else
ct = ;
if (ct > mx)
{
mx = ct;
p = c[i];
}
}
printf("%s\n", p);
}
return ;
} int cmp(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}

P.S. 有个奇怪的地方。这样写就可以:

int n;
while (scanf("%d", &n), n != )
{
...
}

这样就超时:

int n;
scanf("%d", &n);
while (n != )
{
...
scanf("%d", &n);
}

用时:0ms

C++

C++中我就用了string和sort()进行排序。和C语言大体上是相似的。

#include <iostream>
#include <string>
#include <algorithm> int main()
{
using namespace std; int n;
string c[]; ios_base::sync_with_stdio(false); while (cin>>n, n!=)
{
int i;
for (i = ; i < n; i++)
cin >> c[i];
if (n == || n == )
{
cout << c[] << endl;
continue;
}
sort(c, c + n);
int ct = ;
int mx = ;
string & best = c[];
for (i = ; i < n; i++)
{
if (c[i] == c[i - ])
ct++;
else
ct = ;
if (ct > mx)
{
mx = ct;
best = c[i];
}
}
cout << best << endl;
} return ;
}

用时:15ms

方法2

先输入全部的字符串,然后对所有字符串,判断该字符串后面有几个与其相同的(也可以是前面)。数量最多的就是答案。

C

#include <stdio.h>
#include <string.h> int main()
{
int n;
char c[][];
int t[]; while (scanf("%d", &n), n != )
{
int i, j;
for (i = ; i < n; i++)
scanf("%s", c[i]);
for (i = ; i < n; i++)
t[i] = ;
int mx = ;
int best;
for (i = ; i < n - ; i++)
{
for (j = i + ; j < n; j++)
if (strcmp(c[i], c[j]) == )
t[i]++;
if (t[i] > mx)
{
mx = t[i];
best = i;
}
}
printf("%s\n", c[best]);
} return ;
}

用时:0ms

C++

#include <iostream>
#include <string>
#include <algorithm> int main()
{
using namespace std; int n;
string c[];
int t[]; ios_base::sync_with_stdio(false); while (cin >> n, n != )
{
int i, j;
for (i = ; i < n; i++)
cin >> c[i];
fill(t, t + n, ); // set all elements of t[] to 0
int mx = ;
int best;
for (i = ; i < n - ; i++)
{
for (j = i + ; j < n; j++)
if (c[i] == c[j])
t[i]++;
if (t[i] > mx)
{
mx = t[i];
best = i;
}
}
cout << c[best] << endl;
} return ;
}

用时:15ms

方法3

使用map/Map存储一个字符串出现的次数,出现最多的就是答案。注意C++中如果使用map,最好用string存储字符串。

C++

#include <iostream>
#include <map>
#include <string>
int main()
{
using namespace std; map<string, int> col;
int n; ios_base::sync_with_stdio(false); while (cin >> n, n != )
{
string s, p;
int mx = ;
for (int i = ; i < n; i++)
{
cin >> s;
col[s]++;
if (mp[s] > mx)
{
mx = col[s];
p = s;
}
}
cout << p << endl;
} return ;
}

用时:0ms

如果代码可以更好,可以在评论中指出!

注:本文可转载,转载请注明出处:http://www.cnblogs.com/collectionne/p/6792144.html

[HDU1004] Let the balloon rise - 让气球升起来的更多相关文章

  1. HDU1004 Let the Balloon Rise(map的简单用法)

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...

  2. HDU1004——Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  3. hdu1004 Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  4. HDU 1004 Let the Balloon Rise【STL<map>】

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  5. ACM Let the Balloon Rise

    Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...

  6. STL-map-A - Let the Balloon Rise

    A - Let the Balloon Rise Contest time again! How excited it is to see balloons floating around. But ...

  7. hdu 1004 Let the Balloon Rise

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  8. Let the Balloon Rise 分类: HDU 2015-06-19 19:11 7人阅读 评论(0) 收藏

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  9. HDU 1004 Let the Balloon Rise map

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

随机推荐

  1. sql中如何分割字符串

    使用方式: SELECT AllItem AS BldGUID  FROM dbo.fn_split('01.02.03','.') 函数:   GO )) )) --实现split功能 的函数 as ...

  2. Keepalived高可用集群实践

    (1)实践的硬件环境准备 准备4台物理服务器或者4台VM虚拟机,其中两台用来做Keepalived服务器,两台做web测试站点 HOSTNAME I  P 解    释 lb01 10.0.0.7 K ...

  3. 前端随手优化不完全篇-SEO篇

    一代码优化概述 关于代码优化的知识是纯理论的知识,学习的很枯燥.在学到CSS时,不免遇到CSS+div进行代码优化的知 识,因此在网上看了一些关于这方面的知识,简单的整合一下,梳理自己所了解的代码优化 ...

  4. 关于Java中volatile关键字笔记

    volatile通常被认为是一种轻量级的synchronized,字面上它表示易变的,在并发编程中,它保证了共享变量的可见性.所谓可见性指的是,某个线程对变量进行操作后,其他线程能够读取到操作后的最新 ...

  5. centos7 下nfs的配置

    td p { margin-bottom: 0cm } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 补充知识: RPC 主程序: ...

  6. ArrayList 冷门方法

    以下代码片都是 jdk1.8 ArrayList中的官方代码 /** * Constructs a list containing the elements of the specified * co ...

  7. java 内存管理 —— 《Hotspot内存管理白皮书》

    说明   要学习Java或者任意一门技术,我觉得最好的是从官网的资料开始学习.官网所给出的资料总是最权威最知道来龙去脉的.而Java中间,垃圾回收与内存管理是Java中非常重要的一部分.<Hot ...

  8. ELK菜鸟手记 (三) - X-Pack权限控制之给Kibana加上登录控制以及index_not_found_exception问题解决

    0. 背景 我们在使用ELK进行日志记录的时候,通过网址在Kibana中查看我们的应用程序(eg: Java Web)记录的日志, 但是默认是任何客户端都可以访问Kibana的, 这样就会造成很不安全 ...

  9. margin重叠

    margin重叠也就是我们常说的CSS 外边距合并,W3C给出如下定义: 外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 ...

  10. JQuery 中关于插入新元素的方法

    关于JQuery插入新内容的方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - ...