题目链接: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;
}