题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791
题意:给你打印n个范围内的纸的单价,求m次询问中打印纸张数的最小支出。
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll __int64
ll MI(ll a,ll b)
{
return a<b?a:b;
}
ll s[100005],p[100005],sum[100005];
int main()
{
ll n,m,q;
int t,i,l,r,mid;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&m);
for(i=0;i<n;i++)
scanf("%I64d%I64d",&s[i],&p[i]);
sum[n-1]=s[n-1]*p[n-1];
for(i=n-2;i>=0;i--)
sum[i]=MI(sum[i+1],s[i]*p[i]);
while(m--)
{
scanf("%I64d",&q);
if(q>=s[n-1])
printf("%I64d\n",q*p[n-1]);
else
{
l=0;
r=n-1;
ll ans=0;
while(l<r)
{
mid=(l+r)/2;
if(q==s[mid])
{
ans=sum[mid];
break;
}
else if(q>s[mid])
{
if(q<s[mid+1])
{
ans=MI(q*p[mid],sum[mid+1]);
break;
}
else if(q==s[mid+1])
{
ans=sum[mid+1];
break;
}
else
l=mid;
}
else
r=mid;
}
printf("%I64d\n",ans);
}
}
}
return 0;
}