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 }