[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[1000][16];    // Not c[16][1000]!!!
    while (scanf("%d", &n), n != 0)
    {
        int i;
        for (i = 0; i < n; i++)
            scanf("%s", c[i]);
        if (n == 1 || n == 2)
        {
            printf("%s\n", c[0]);
            continue;
        }
        qsort(c, n, sizeof(c[0]), cmp);
        int ct = 1;
        int mx = 0;
        char * p;
        for (i = 1; i < n; i++)
        {
            if (strcmp(c[i], c[i - 1]) == 0)  // Use strcmp() instead of == to compare two strings  
                ct++;
            else
                ct = 1;
            if (ct > mx)
            {
                mx = ct;
                p = c[i];
            }
        }
        printf("%s\n", p);
    }
    return 0;
}

int cmp(const void *a, const void *b)
{
    return strcmp((char *)a, (char *)b);
}

 

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

 

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

 

这样就超时:

 

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

 

用时:0ms

 

C++

 

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

 

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    using namespace std;

    int n;
    string c[1000];

    ios_base::sync_with_stdio(false);

    while (cin>>n, n!=0)
    {
        int i;
        for (i = 0; i < n; i++)
            cin >> c[i];
        if (n == 1 || n == 2)
        {
            cout << c[0] << endl;
            continue;
        }
        sort(c, c + n);
        int ct = 1;
        int mx = 0;
        string & best = c[0];
        for (i = 1; i < n; i++)
        {
            if (c[i] == c[i - 1])
                ct++;
            else
                ct = 1;
            if (ct > mx)
            {
                mx = ct;
                best = c[i];
            }
        }
        cout << best << endl;
    }

    return 0;
}

 

用时:15ms

 

方法2

 

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

 

C

 

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    char c[1000][16];
    int t[1000];

    while (scanf("%d", &n), n != 0)
    {
        int i, j;
        for (i = 0; i < n; i++)
            scanf("%s", c[i]);
        for (i = 0; i < n; i++)
            t[i] = 0;
        int mx = 0;
        int best;
        for (i = 0; i < n - 1; i++)
        {
            for (j = i + 1; j < n; j++)
                if (strcmp(c[i], c[j]) == 0)
                    t[i]++;
            if (t[i] > mx)
            {
                mx = t[i];
                best = i;
            }
        }
        printf("%s\n", c[best]);
    }

    return 0;
}

 

用时:0ms

 

C++

 

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    using namespace std;
    
    int n;
    string c[1000];
    int t[1000];

    ios_base::sync_with_stdio(false);
    
    while (cin >> n, n != 0)
    {
        int i, j;
        for (i = 0; i < n; i++)
            cin >> c[i];
        fill(t, t + n, 0);        // set all elements of t[] to 0
        int mx = 0;
        int best;
        for (i = 0; i < n - 1; i++)
        {
            for (j = i + 1; j < n; j++)
                if (c[i] == c[j])
                    t[i]++;
            if (t[i] > mx)
            {
                mx = t[i];
                best = i;
            }
        }
        cout << c[best] << endl;
    }

    return 0;
}

 

用时: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 != 0)
    {
        string s, p;
        int mx = 0;
        for (int i = 0; i < n; i++)
        {
            cin >> s;
            col[s]++;
            if (mp[s] > mx)
            {
                mx = col[s];
                p = s;
            }
        }
        cout << p << endl;
    }

    return 0;
}

 

用时:0ms

 

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

 

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

posted @ 2017-05-01 16:35  collectionne  阅读(954)  评论(0编辑  收藏  举报