码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-4791-Alice‘s Print Service

时间:2018-07-27 22:24:29      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:return   continue   lower   span   技术分享   algo   scan   分享   math   

技术分享图片

分析:

1.由于价格是递减的,所以可能出现si*pi>sj*pj(j>i)。所以要有一个数组来储存当前端点的最小值。

2.然后二分查找当前的si,比较q*p[i]和M[i+1].不过在这之前要确认i是小于n的。】

3.upper_bound是返回第一个大于当前值得坐标,否则返回左闭右开的右端点。而lower_bound是返回第一个大于等于当前值得坐标。所以这里采用upper_bound。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <math.h>
 4 #include <algorithm>
 5 using namespace std;
 6 #define M 100010
 7 #define ll long long
 8 ll s[M],p[M],q[M];
 9 ll n,m;
10 ll best[M];
11 int main()
12 {
13     int T;
14     scanf("%d",&T);
15     for(int i=0;i<T;i++)
16     {
17 
18         scanf("%d%d",&n,&m);
19         for(int i=1;i<=n;i++)
20         {
21             scanf("%lld%lld",&s[i],&p[i]);
22         }
23         ll Min = s[n]*p[n];
24         best[n] = Min;
25         for(int i =n-1;i>=1;i--)
26         {
27             Min = min(Min,s[i]*p[i]);
28             best[i] = Min;
29         }
30         for(int i=1;i<=m;i++)
31         {
32             scanf("%lld",&q[i]);
33         }
34         for(int i=1;i<=m;i++)
35         {
36             if(q[i]>=s[n])
37             {
38                 printf("%lld\n",q[i]*p[n]);
39                 continue;
40             }
41             int t = upper_bound(s+1,s+1+n,q[i])-s-1;
42             printf("%lld\n",min(best[t+1],q[i]*p[t]));
43         }
44     }
45     return 0;
46 }

 

HDU-4791-Alice‘s Print Service

标签:return   continue   lower   span   技术分享   algo   scan   分享   math   

原文地址:https://www.cnblogs.com/1625--H/p/9379709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!