链接:https://vjudge.net/problem/HDU-2648

Task

Every girl likes shopping,so does dandelion.Now she finds the shop is increasing the price every day because the Spring Festival is coming .She is fond of a shop which is called “memory”. Now she wants to know the rank of this shop’s price after the change of everyday.

Input

One line contians a number n ( n<=10000),stands for the number of shops. Then n lines ,each line contains a string (the length is short than 31 and only contains lowercase letters and capital letters.)stands for the name of the shop. Then a line contians a number m (1<=m<=50),stands for the days . Then m parts , every parts contians n lines , each line contians a number s and a string p ,stands for this day ,the shop p ’s price has increased s.

Output

Contains m lines ,In the ith line print a number of the shop “memory” ’s rank after the ith day. We define the rank as :If there are t shops’ price is higher than the “memory” , than its rank is t+1.

Sample

input:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
3
memory
kfc
wind
2
49 memory
49 kfc
48 wind
80 kfc
85 wind
83 memory

output:

1
2
1
2

Solution

只需将各商店每天的价格相加,最后数“memory”排第几就行。用一个数组prices存储各商店的价格。但输入每天的价格增长时是乱序,所以需要用字典(哈希表)来做一个名称到id的映射,用unordered_map实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<cstdio>
#include<cstring>
#include<unordered_map>
using namespace std;
int main(){
    int m,n,delta,target_id;
    char name[31];
    int prices[10000];
    // mapping from string to id
    unordered_map<string,int> mapping;
    while(scanf("%d",&n)!=EOF){
        mapping.clear();
        // init, mapping string to id and set prices
        for(int i=0; i<n; ++i){
            scanf("%s",name);
            if(strcmp(name,"memory")==0)
                target_id=i;
            mapping[name]=i;
            prices[i]=0;
        }
        scanf("%d",&m);
        while(m--){
            // increase price
            for(int i=0; i<n; ++i){
                scanf("%d %s",&delta,name);
                prices[mapping[name]]+=delta;
            }
            // get order
            int cnt=0;
            for(int i=0; i<n; ++i)
                if(prices[i]>prices[target_id])
                    cnt++;
            printf("%d\n",cnt+1);
        }
    }
    return 0;
}