2013 ACM区域赛长沙 A Alice’s Print Service HDU 4791

时间:2023-03-09 23:48:40
2013 ACM区域赛长沙 A Alice’s Print Service HDU 4791

题意:就是一个打印分段收费政策,印的越多,单张价格越低,输入需要印刷的数量,求最小印刷费用一个细节就是,比当前还小的状态可能是最后几个。

 #include<stdio.h>
#include<string.h>
#include<cstdio>
#include<string>
#include<math.h>
#include<algorithm>
#include<iostream>
#define LL long long
#define PI atan(1.0)*4
#define DD double
#define MAX 200200
#define mod 100
#define dian 1.000000011
#define INF 0x3f3f3f
#define clc(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=;
LL s[maxn],p[maxn],c[maxn];
LL minn[maxn];//记录i之后最小的s*p,不包括当前i状态
int main() {
// freopen("inn.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--) {
int n,m;
LL ans=;
clc(s,);
clc(p,);
clc(c,);
scanf("%d%d",&n,&m);
for(int i=; i<n; i++) {
scanf("%I64d%I64d",&s[i],&p[i]);
c[i]=s[i]*p[i];
}
LL minx=c[n-];
minn[n-]=c[n-];
for(int i=n-;i>=;i--){
if(c[i+]<minx){
minx=c[i+];
minn[i]=minx;
}
else{
minn[i]=minx;
}
}
while(m--) {
LL q;
scanf("%I64d",&q);
int pos=upper_bound(s,s+n,q)-s;
if(pos==n){
printf("%lld\n",q*p[n-]);
continue;
}
if(pos==) ;
else
pos=pos-;
LL pri=p[pos]*q;
if(pri>minn[pos])
ans=minn[pos];
else
ans=pri;
printf("%lld\n",ans);
}
}
return ;
}