题目
每个女孩都喜欢购物,蒲公英也喜欢。现在,由于春节临近,她发现这家商店每天都在涨价。她喜欢一家叫做“记忆”的商店。现在她想知道每天变化后这家商店的价格排名。
输入项
一行包含一个数字n(n <= 10000),代表商店的数量。
然后n行,每行包含一个字符串(长度小于31,并且仅包含小写字母和大写字母。)代表商店的名称。
然后一行包含一个数字m(1 <= m <= 50),代表天。
然后,m个零件中,每个零件包含n行,每行包含一个数字s和一个字符串p,代表这一天,商店p的价格增加了s。
输出量
包含m行,在第i行第i天后打印多个商店“内存”的等级。我们将等级定义为:如果有t家商店的价格高于“内存”,则其等级为t + 1。
注意 !这题巨坑,测试数据有多组,但题目没说。
Sample Input
3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory
Sample Output
1
2
答案
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
struct node{
char name[35];
int price;
};
vector<node>List[N];//动态数组储存商店名字和价格;
unsigned int BKDRHash(char *str){
unsigned int seed=31,key=0;
while(*str)
key=key*seed+(*str++);
return key & 0x7fffffff;
}
int main(){
int n,m,key,add,memory_price,rank,len;
int p[N];
char s[35];
node t;
while(cin>>n){
for(int i=0;i<N;i++)
List[i].clear();
for(int i=0;i<n;i++){
cin>>t.name;
key=BKDRHash(t.name)%N;//商店储存
List[key].push_back(t);
}
cin>>m;
while(m--){
rank=len=0;
for(int i=0;i<n;i++){
cin>>add>>s;
key=BKDRHash(s)%N;//找商店的位置
for(int j=0;j<List[key].size();j++)
if(strcmp(List[key][j].name,s)==0){
List[key][j].price+=add;
if(strcmp(s,"memory")==0)
memory_price=List[key][j].price;
else
p[len++]=List[key][j].price;
break;
}
}
for(int i=0;i<len;i++)
if(memory_price<p[i])
rank++;
cout<<rank+1<<endl;
}
}
return 0;
}