有两种做法,暂时先放上一种。用STL map。
#include<iostream>
using namespace std;
#include<map>
#include<string>
#define N 10000
int node[N];
int main()
{
map<string,int> key;
int n,m;
string str;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
for(i=0;i<n;i++)
{
cin>>str;
if(str=="memory")
k=i; // 记录memory商店的位置
key[str]=i; // string指向i
}
for(i=0;i<n;i++)
node[i]=0;
int val,d,rank;
scanf("%d",&m);
for(j=0;j<m;j++)
{
for(i=0;i<n;i++)
{
cin>>val>>str;
node[key[str]]+=val;
}
for(d=rank=0;d<n;d++)
if(node[k]<node[d])
rank++;
printf("%d\n",rank+1);
}
}
return 0;
}
用hash搜索,时间节省十倍,好好看看。
#include<iostream>
using namespace std;
#include<vector>
const int prime=13131;
int price[10000];
unsigned int BKDRHash(char *str)
{
unsigned int seed = 31,key = 0;
while(*str)
key = key*seed+ *str++;
return key&(0x7fffffff);
}
struct node
{
int money;
char str[31];
}temp;
int main()
{
int i,j,n;
char s[31];
while(scanf("%d",&n)!=EOF)
{
vector<node>shop[prime];
int key;
for(i=0;i<n;i++)
{
scanf("%s",s);
key=BKDRHash(s)%prime;
temp.money=0;
strcpy(temp.str,s);
shop[key].push_back(temp); //插入到哈希表
}
int m;
scanf("%d",&m);
int res,len,val,t,rank;
int flag;
while(m--)
{
flag=0; // 记录memory的价格
t=0; // 记录所有价格
rank=0; //记录比memory的shop的数量
for(i=0;i<n;i++)
{
scanf("%d%s",&val,s);
key=BKDRHash(s)%prime;
len=shop[key].size(); //记录以key值为这行的长度
for(j=0;j<len;j++)
{
if(strcmp(shop[key][j].str,s)==0)
{
shop[key][j].money+=val;
res=shop[key][j].money;
break;
}
}
if(strcmp(s,"memory"))
price[t++]=res; //把价格存入一数组
else
flag=res; // 记录memory的价格
}
for(i=0;i<t;i++)
if(flag<price[i])
rank++;
printf("%d\n",rank+1);
}
}
return 0;
}