[HDU1004] Let the balloon rise - 让气球升起来
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 - 让气球升起来的更多相关文章
- HDU1004 Let the Balloon Rise(map的简单用法)
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU1004——Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- hdu1004 Let the Balloon Rise
Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...
- 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 ...
- ACM Let the Balloon Rise
Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the ...
- 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 ...
- hdu 1004 Let the Balloon Rise
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 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 ...
- 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 ...
随机推荐
- ES6 对let声明的一点思考
说到ES6的let变量声明,我估计很多人会想起下面几个主要的特点: 没有变量声明提升 拥有块级作用域 暂时死区 不能重复声明 很多教程和总结基本都说到了这几点(说实话大部分文章都大同小异,摘录的居多) ...
- 【局域网聊天客户端篇】基于socket与Qt
前言 暑假把linux下的高级编程和网络编程学习了一遍,学习很重要,但是也得有个练手的地方,所以必须做做项目来认识下自己所学习的知识. 能够找到小伙伴一起做项目也是一件很快乐的事情的,很幸运的有两个小 ...
- java多线程基本概述(七)——join()方法
在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法.调用join()方法的意思是当前线程 ...
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...
- bzoj4817 [Sdoi2017]树点涂色
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- 如何解决 chrome 58 版本更新导致的 fiddler https 抓包不可用问题
注意!如果该方法不生效,请先卸载原有 fiddler 后再进行新版本 fiddler 安装步骤即可. chrome 于(上周?上上周?)推送了chrome 58 版本的更新,这次更新中直接去掉了证书未 ...
- Hadoop集群
你可以用以下三种支持的模式中的一种启动Hadoop集群: 单机模式 伪分布式模式 完全分布式模式 单机模式的操作方法 默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程.这对调试 ...
- windows10 配置 华为vpn客户端
2017-05-08 1. 安装客户端软件VPNClient_V100R001C02SPC703.exe 2. 新建vpn 安装完成后,打开客户端连接vpn,发现未启用虚拟网卡(这是因为还需要安装客户 ...
- HttpClient和 HtmlParser实现爬虫
网络爬虫技术 1 什么叫网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不 ...
- [故障公告]14:39-15:39博客站点部分负载均衡遭遇3次20G以上的流量攻击
非常抱歉,今天下午14:39-15:39左右,博客站点的部分负载均衡遭遇3次20G以上的流量攻击,造成很多用户不能正常访问.由此给您带来麻烦,请您谅解. 攻击的过程是这样的: 14:39,第1次攻 ...