2018湘潭大学程序设计竞赛【E】

题目链接:https://www.nowcoder.com/acm/contest/105/E

题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物。(X真是对自己的表达能力感到悲伤啊)。

题解:乍一看其实用线段树是最优解。当时懒得敲板子,不想用线段树。类似于这种找最值的,其实可以用前缀数组维护最大差值。坑点就是啊二分啊。这里的二分就是找最接近的价格,从前缀数组里找到最优美味度的解。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 #define Max 1000010
 5 int n,m;
 6 int pre[Max];
 7 struct Food{
 8     int d;
 9     int c;
10 };
11 Food food[Max];
12 bool cmp(Food a,Food b){
13     return a.d<b.d;
14 }
15 
16 int find(int l,int r,int x){
17     int ans;
18     while(l <= r){
19         int mid = (l + r) / 2;
20         if(food[x].d <= x)
21             l=mid+1,ans = mid;    
22         else
23             r = mid - 1;
24     }
25     return ans;
26     
27 }
28 int main(){
29     int T;
30     scanf("%d",&T);
31     while(T--){
32         scanf("%d%d",&n,&m);        
33         for(int i = 1 ;i <= n ;i++){
34             scanf("%d%d",&food[i].d,&food[i].c);
35         }
36         sort(food+1,food+n+1,cmp);
37         
38         pre[0]=0;
39         for(int i = 1; i <= n; i++)
40             pre[i]=max(pre[i-1],food[i].c);
41         int t;
42         while(m--){
43             scanf("%d",&t);
44             int ans = find(1,n,t);
45             printf("%d\n",pre[ans]); 
46         }
47     }
48     
49     
50     return 0;
51 }
View Code

猜你喜欢

转载自www.cnblogs.com/Asumi/p/8987729.html