ZOJ 3726 Alice's Print Service
2014-07-28 14:58
399 查看
题意:给你n个范围,每个范围都有一个价值,再给你m个询问,问最少要花多少钱
这道题我们小组使用二分来做的。先预处理,处理出某个状态临界以后的最小值,用数组存储,然后在进行二分查找,找出询问的下界,然后再进行比较,选取其中的较小值。
这道题我们小组使用二分来做的。先预处理,处理出某个状态临界以后的最小值,用数组存储,然后在进行二分查找,找出询问的下界,然后再进行比较,选取其中的较小值。
#include <stdio.h> #include <iostream> #include <math.h> #include <string.h> #include <stdlib.h> #include <algorithm> #include <bitset> #include <queue> using namespace std; typedef long long ll; ll p[100083],s[100083],n; ll v[100083]; int binary(int L,int R,int key)//二分查找 { int ret; while(L<=R) { int mid=(L+R)/2; if(key>=s[mid]) { L=mid+1; ret=mid; } else R=mid -1; } return ret; } int main() { int T; cin>>T; while(T--) { int n, m; cin >>n>>m; for(int i=0;i<n;i++) { scanf("%I64d%I64d",&s[i],&p[i]); } v[n-1]=s[n-1]*p[n-1]; for(int i=n-1;i>=1;i-- ) { v[i-1]=min(v[i],s[i-1]*p[i-1]);//预处理,找出最小值 } ll g, result, k; for(int i=0;i<m;i++) { scanf("%I64d",&g); k=binary(0,n-1,g); if(k==n-1) result=g*p[n-1]; else { result=min(g*p[k],v[k+1]); } printf("%I64d\n",result); } } return 0; }
相关文章推荐
- ZOJ 3726 Alice's Print Service(RMQ)
- ZOJ 3726 Alice's Print Service
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
- zoj-3726-Alice's Print Service【二分+rmq】
- zoj 3726& hdu 4791 Alice's Print Service
- hdu4791-Alice's Print Service(离线+暴力)
- ZOJ 3726 Alice's Print Service RMQ
- HDU4791 Alice's Print Service
- HDU 4791 Alice's Print Service
- HDU 4791 Alice's Print Service
- HDU - 4791 Alice's Print Service
- 2013长沙现场赛 Alice's Print Service
- hdu4791 Alice's Print Service
- hdu 4791 Alice's Print Service (DP+离线处理)
- HDU 4791 Alice's Print Service
- hdu 4791 Alice's Print Service
- ZOJ 3562 Alice's Sequence I
- NYOJ 933 Bob's Print Service
- zoj 3633 Alice's present(离线+线段树)