nysit 251—AMAZING AUCTION

来源:互联网 发布:淘宝小帮手 编辑:程序博客网 时间:2024/06/05 01:41

其实这是一道非常简单的题,用专业术语来说,是用哈希表,直接定位查找。

(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;
}

原创粉丝点击