2018年湘潭大学程序设计竞赛 E 吃货
作者:互联网
题目描述
作为一个标准的吃货,mostshy又打算去联建商业街觅食了。混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种美食。
mostshy想知道,假如带t元去商业街,只能吃一种食物,能够品味到的美食的美味度最高是多少?
输入描述:
第一行是一个整数T(1 ≤ T ≤ 10),表示样例的个数。
以后每个样例第一行是两个整数n,m(1 ≤ n,m ≤ 30000),表示美食的种类数与查询的次数。
接下来n行,每行两个整数分别表示第i种美食的价格与美味度di,ci (1 ≤ di,ci ≤ 109)。
接下来m行,每行一个整数表示mostshy带t(1 ≤ t ≤ 109)元去商业街觅食。
输出描述:
每个查询输出一行,一个整数,表示带t元去商业街能够品味到美食的最高美味度是多少,如果不存在这样的美食,输出0。示例1
输入
复制1 3 3 1 100 10 1000 1000000000 1001 9 10 1000000000
输出
复制100 1000 1001
说明
大量的输入输出,请使用C风格的输入输出。
1 //排序是为了进行二分 2 //3*10^4*3*10^4*10 直接暴力肯定会超时的 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <queue> 7 #include <algorithm> 8 using namespace std; 9 const int N =5e5+9; 10 int t,n,m; 11 struct Node 12 { 13 int d,c; 14 15 }e[N]; 16 bool cmp(Node a,Node b) return a.d<b.d; 17 int a[N]; 18 int main() 19 { 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%d%d",&n,&m); 24 for(int i=0;i<n;i++) 25 { 26 scanf("%d%d",&e[i].d,&e[i].c); 27 28 } 29 sort(e,e+n,cmp); 30 for(int i=0;i<n;i++) { 31 a[i] = e[i].d; 32 33 } 34 for(int i=1;i<n;i++)//可以买我,那么我前面的也都可以买 35 { //我的c就是从0到我的c里面的最大值。 36 if(e[i].c<e[i-1].c) 37 e[i].c=e[i-1].c; 38 }//不排序会超时 39 while(m--) 40 { 41 42 int x; 43 scanf("%d",&x); 44 if(e[0].d>x)//别忘了 45 { 46 printf("0\n"); 47 continue; 48 } 49 /* 50 int l=0,r=n-1; 51 52 while(l<=r)//因为可能是n-1,所以要有== 53 { 54 int mid=(l+r)>>1; 55 if(e[mid].d<=x) 56 { 57 l=mid+1; 58 } 59 else 60 { 61 r=mid-1; 62 } 63 } 64 */ 65 int l =lower_bound(a,a+n,x)-a; 66 if(l==n) l--;//坑点 67 else if(a[l]>x) l--; 68 //二分或者利用函数都可以,但要注意坑点。 69 printf("%d\n",e[l].c); 70 } 71 } 72 return 0; 73 }
标签:10,湘潭,int,吃货,商业街,2018,美食,mostshy,include 来源: https://www.cnblogs.com/tingtin/p/10582054.html