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

       这道题一眼看上去以为是一道01背包题,然后仔细一看题,发现只需要找出不大于钱数的最大美味度就好了。但是如果直接遍历查找的话会超时,所以需要用二分去查找,还要注意的是可能会有价值相同但美味度不同的情况,所以需要进行一次预处理,让价值相同的值的最后一个的美味度最大(具体看代码)。


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
struct Node{
  ll x,y;
}Edge[300005];
ll n,m;
int T;

bool cmp(Node a,Node b){
  return a.x < b.x;
}

int main()
{
  scanf("%d",&T);
  while(T--){
    scanf("%lld%lld",&n,&m);
    for(int i=0;i<n;i++){
      scanf("%lld%lld",&Edge[i].x,&Edge[i].y);
    }
    sort(Edge,Edge+n,cmp);
    for(int i=1;i<n;i++){
      Edge[i].y = max(Edge[i].y, Edge[i-1].y);
    }
    while(m--){
      ll p;
      scanf("%lld",&p);
      ll l = 0, r = n-1, mid;
      ll ans = 0;
      while(l <= r){
        mid = (l + r) / 2;
        if(Edge[mid].x <= p){
          ans = Edge[mid].y;
          l = mid + 1;
        }
        else{
          if(l == r)break;
          r = mid;
        }
      }
      printf("%lld\n",ans);
    }
  }
  return 0;
}