您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: