为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
【输入描述】
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
【输出描述】
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
【样例】
input:
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
output:
100
1000
1001
【代码】
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<memory.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define mem(array) memset((array),0,sizeof((array)))
#define Qsort(array,len,cmp) qsort(array,len,sizeof(array[0]),cmp)
#define inf 0x7fffffff
#define MAXN 10+100000
using namespace std;
struct Node{
int d;
int p;
}work[MAXN];
int A[MAXN];
int n,m;
int arr[MAXN];
int binarySearch(int* a, int n, int x)
{
if(x < a[0])
return -1;
if(x > a[n-1])
return n-1;
int l = 0;
int r = n-1;
int mid;
bool getAns = false;
while(l <= r){
mid = (l+r)>>1;
if(x == a[mid]) {getAns = true; break;}
if(x < a[mid]) {r = mid-1; continue;}
if(x > a[mid]) {l = mid+1; continue;}
}
if(getAns){
while(mid < n && x == a[mid])
++mid;
return mid-1;
}
else{
return r;
}
}
int cmpInt2(const void *a, const void *b)
{
if(((Node*)a)->d == ((Node*)b)->d)
return ((Node*)a)->p - ((Node*)b)->p;
return ((Node*)a)->d - ((Node*)b)->d; /*** from small to large */
//return (*(Node*)b)->x - (*(Node*)a)->x; /*** from large to small*/
//return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",tdout);
int ans = -1;
while(cin>>n>>m){
mem(work);
mem(A);
for(int i = 0; i < n; ++i)
scanf("%d%d",&work[i].d,&work[i].p);
for(int i = 0; i < m; ++i)
scanf("%d",&A[i]);
qsort(work,n,sizeof(work[0]),cmpInt2);
for(int i = 0; i < n-1; ++i){
if(work[i+1].p < work[i].p)
work[i+1].p = work[i].p;
}
for(int i = 0; i < n; ++i)
arr[i] = work[i].d;
for(int i = 0; i < m; ++i){
int index;
index = binarySearch(arr,n,A[i]);
if(index < 0)
printf("0\n");
else
printf("%d\n",work[index].p);
}
}
return 0;
}
【分析】
当时咋就没想到 能力越高报酬越多这个条件呢。。。!
此外,查找还需要二分查找,否则会超时。
题目来源于 牛客网