做题思路:按每天生长速度排序,再按高度排序,每次遍历找到最靠左的且最高的那个记录idx,排序的话是生长速度是第一序 高度按第二序。这样就可以直接暴力水过了。在群里别人告诉我的思路
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
#define maxn 100006
struct node
{
int h,v;
}num[maxn];
struct Que
{
int val;
int ID;
int ans;
}Q[maxn];
bool cmp1(node a,node b)
{
return ( a.v>b.v )||( a.v==b.v && a.h>b.h);
}
bool cmp2(Que a,Que b)
{
return a.val < b.val;
}
bool cmp3(Que a,Que b)
{
return a.ID < b.ID;
}
int main()
{
int n,m;
int i,j;
int MAX;
int id;
int tmp;
int iid;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&num[i].h,&num[i].v);
}
sort(num,num+n,cmp1);
MAX=-1;
for(i=0;i<n;i++)
{
if(num[i].h>MAX)
{
MAX=num[i].h;
id=i;
}
}
离线算法///
for(i=0;i<m;i++)
{
scanf("%d",&Q[i].val);
Q[i].ID=i;
}
sort(Q,Q+m,cmp2);
for(i=0;i<m;i++)
{
MAX=-1;
for(j=0;j<=id;j++)
{
tmp=Q[i].val*num[j].v+num[j].h;
if(MAX<tmp)
{
MAX=tmp;
iid=j;
}
}
Q[i].ans=MAX;
id=iid;
}
sort(Q,Q+m,cmp3);
for(i=0;i<m;i++)
printf("%d\n",Q[i].ans);
}
return 0;
}