其实这是一道非常简单的题,用专业术语来说,是用哈希表,直接定位查找。
(1)因为是先找次数最小的,再找价格最小的,就是count的优先级大于price。
定义一个数字,下标存放价格,值存放出现的次数。
然后找出现次数最少的,并且价格是最低的。
在考虑这一点时,我是先这样想的,U代表的是价格上限,for(i=1;i<=U;i++)
{ 找次数等于一次的;没找到,次数加一,直到找到} 相当于用了两层循环,真的很笨 耶!
后来看了别人的代码,非常简单。再增加一个变量few,初始值先给few一个很大的值,用10000吧!然后用few来记录出现的最 少次数。
for(i=1;i<=U;i++)
if(count[i]&&few>count[i])
{
few=count;
price=i;
}
这样就找到了所求价格price!
(2)遇到的第二个问题是,人名我是用string name[],字符串数组来储存的,接受输入的时候,我用的是cin,输出我用printf,会出现乱码。改为cout就成功了!因为在C语言中没有 string类型,所以一般用scanf 和printf对string类型进行处理,都会出错,所以我想碰见string类型时,最好用 cin和 cout。
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<sstream>
using namespace std;
int bid[1002];
int main()
{
int U,M;
string name[102];
int P[102];
while(scanf("%d%d",&U,&M)!=EOF)
{
memset(bid,0,sizeof(bid));
int i;
for(i=0;i<M;i++)
{
cin>>name[i]>>P[i];
bid[P[i]]++;
}
int few=10000;
int price=0; //所求的价格
for(i=1;i<=U;i++)
{
if(bid[i]&&few>bid[i])
{
few=bid[i];
price=i;
}
}
//找是哪个人喊出的
string str="";
for(int j=0;j<M;j++)
{
if(P[j]==price)
{
str=name[j];
break;
}
}
cout<<"The winner is "<<str<<endl<<"The price is "<<price<<endl;
// printf("%d\n",price);
}
return 0;
}