标签:des style io color ar os java for sp
1 2 3 0 20 100 10 0 99 100
0 1000 1000
题意:给n种方案,打印量≥ si 时,每张纸的打印价格为pi(0≤n≤100000),问打印m次
询问,打印 qi 张时最少需要多少钱(0≤m≤100000)。
思路 : 先将询问都储存起来,然后按需求从小到大排序,依次求出答案,最后再输出。
#include <iostream>
#include <algorithm>
#include <cstdio>
#define ll long long
using namespace std;
const int maxn=100005;
struct node
{
ll s,p,cost;
}a[maxn];
struct code
{
int index;
ll ans,num;
}b[maxn];
int n,m;
bool cmp1(code p,code q)
{
return p.num<q.num;
}
bool cmp2(code p,code q)
{
return p.index<q.index;
}
void input()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%I64d%I64d",&a[i].s,&a[i].p);
for(int i=0;i<m;i++)
{
scanf("%I64d",&b[i].num);
b[i].index=i+1;
}
sort(b,b+m,cmp1);
}
void solve()
{
a[n-1].cost=a[n-1].s*a[n-1].p;
for(int i=n-2;i>=0;i--) a[i].cost=min(a[i].s*a[i].p,a[i+1].cost);
int cnt=0;
for(int i=0;i<m;i++)
{
while(cnt<n && a[cnt].s<=b[i].num) cnt++;
if(cnt==n) b[i].ans=b[i].num*a[n-1].p;
else b[i].ans=min(b[i].num*a[cnt-1].p,a[cnt].cost);
}
sort(b,b+m,cmp2);
for(int i=0;i<m;i++) printf("%I64d\n",b[i].ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
input();
solve();
}
return 0;
}
hdu 4791 Alice's Print Service (DP+离线处理)
标签:des style io color ar os java for sp
原文地址:http://blog.csdn.net/u012596172/article/details/40783045