题目1416:猴子吃坚果
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:947
解决:286
-
题目描述:
-
动物园的猴子吃坚果的顺序都是按强壮程度来定的,最强壮的吃完才能轮到下一个,现在我们给出各个猴子的名字,强壮程度,吃饱的量,然后查询对应的猴子必须要扔多少坚果才可以轮到。
-
输入:
-
输入有多组,对于每组输入:
输入的第一行包括两个整数n(1<=n<=10000),代表动物园中猴子的个数,以及m(1<=m<=10000),代表我们要查询的次数。
接下来的n行,每行包括一个字符串(代表猴子的名字,长度1<=len<=100),一个整数a(1<=a<=10000),代表猴子的强壮程度,一个整数b(1<=b<=10000),代表猴子吃饱所需要的食物量。
-
输出:
-
对于每次查询,输出最少需要多少食物,被查询的这只猴子才能吃到食物。
-
样例输入:
-
3 2monkey_a 4 2monkey_b 3 4monkey_c 5 3monkey_amonkey_c4 2monkey_a 4 2monkey_b 3 4monkey_c 5 3monkey_d 5 3monkey_amonkey_c
-
样例输出:
-
4171
-
提示:
-
如果有两只猴子的强壮程度相同,就按照猴子名字的字母序来决定吃食物的先后顺序。
#include <stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<string.h> using namespace std; struct monkey { char name [100]; int strong ; int food; }; bool cmp(monkey a ,monkey b) { if(a.strong==b.strong) return strcmp(a.name,b.name)<0; else return a.strong>b.strong; } int main() { int n , m ; int i ,j ; char name[100]; int strong , food; int sum; //priority_queue<monkey> q; vector<monkey> v; //FILE *fp = freopen("test.txt","r", stdin); while(scanf("%d%d",&n,&m)!=EOF) { v.clear(); for(i = 0 ; i<n ; i++) { monkey m; scanf("%s %d %d", name , &strong ,&food); strcpy(m.name,name); m.strong = strong; m.food = food; //q.push(m); v.push_back(m); } sort(v.begin(),v.end(),cmp); //priority_queue<monkey>::iterator it ; for(i = 0 ; i<m ; i++) { scanf("%s", name); sum=1; for(j = 0 ; j<n ;j++) { if(strcmp(v[j].name , name)==0) { printf("%d\n",sum); break; } else { sum+=v[j].food; } } /* for(it = q.begin();it!=q.end();it++) { monkey temp = *it; if(strcmp(temp.name , name)==0) { printf("%d\n",sum); break; } else { sum+=temp.food; } } */ } } return 0; }