Let the Balloon Rise
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 123288 Accepted Submission(s): 48595Problem 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.
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.
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.Sample Input
5
green
red
blue
red
red
3
pink
orange
pink
0Sample Output
red
pink
思路
1、C用strcmp来比较两个字符串是否相等,若相等计数器加1,计数器利用数组。C++可用结构体利用string直接进行比较,计数器利用结构体中的属性
2、C输出出现最多次的颜色利用寻找max的方法,C++也是如此
C解法
#include <stdio.h>
#include <string.h>
int main()
{
int h;
int j;
int t;
scanf("%d",&h);
while(h)
{
char s[1000][16]={0};
char s2[15]={0};
int a[1001]={0};
int max=0;
if(h<0)
{
break;
}
for(j=0;j<h;j++)
{
scanf("%s",s[j]);
if(strlen(s[j])>15)
{
continue;
}
}
for(j=0;j<h;j++)
{
for(t=j+1;t<h;t++)
{
if(strcmp(s[t],s[j])==0)
{
a[t]++;
}
}
}
j=0;
max=a[j];
strcpy(s2,s[j]);
for(j=1;j<h;j++)
{
if(a[j]>max)
{
max=a[j];//注意
strcpy(s2,s[j]);
}
}
printf("%s\n",s2);
scanf("%d",&h);
}
return 0;
}
刚开始一直WA。后来发现最后max=a[j]这句忘写了
C++解法(OJ选C++)
#include <iostream>
#include <string>
using namespace std;
struct ballon{
string color;
int ColorNum;
};
int main()
{
ballon *input;
int n;
string str="null";
while(cin>>n&&n)
{
char s[1001];
int max=0;
int Max_i;
int Max_color;
input=new ballon[n];
for(int i=0;i<n;i++)
{
cin>>input[i].color;
input[i].ColorNum=1;
}
for(int j=0;j<n;j++)
{
for(int i=j+1;i<n;i++)
{
if(input[j].color==input[i].color)
{
input[i].ColorNum++;
}
}
}
Max_color=0;
for(int j=0;j<n;j++)
{
if(input[j].color==str)
continue;
else if(input[j].ColorNum>Max_color)
{
Max_color=input[j].ColorNum;
Max_i=j;
}
}
cout<<input[Max_i].color<<endl;
delete [] input;
}
return 0;
}
用C++写是为了顺便复习下C++和结构体、还有new、delete这块
总结
1、刚开始遇到个问题就是为什么定义了字符数组的大小,输入时超过了数组大小也可以输出(基础不扎实),然后后来问了度娘才想起来:C语言不检查数组越界行为
2、new的基本格式以及用法
一般使用格式:
格式1:指针变量名=new 类型标识符;
格式2:指针变量名=new 类型标识符(初始值);
格式3:指针变量名=new 类型标识符 [内存单元个数];
说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。