zoukankan      html  css  js  c++  java
  • bzoj1346: [Baltic2006]Coin

    Description

    有一个国家,流通着N种面值的硬币,其中包括了1分硬币。另外,有一种面值为K分的纸币,它超过了所有硬币的面值。 有一位硬币收藏家,他想收集每一种面值的硬币样本。他家里已经有一些硬币,但是现在他只带着一张K分纸币去商店。 商店里总共有K-1种商品,价格分别为1分、2分……K-1分。这家商店使用以下算法找零: 1、 假设总共需要找A分; 2、 寻找最高的不超过A的硬币面值,设它为B分硬币; 3、 给顾客一枚B分硬币,然后令A为A-B; 4、 如果A=0,算法结束;否则转2。 收藏家想用他的K分纸币买一件商品。请你编写程序,计算:  收藏家能够得到多少种他还没有过的硬币?  在满足上一问的前提下,他能够买的最贵的商品是什么?

    Input

    第一行为两个整数N(1≤N≤500000)和K(2≤K≤1000000000)。 以下N行描述流通的硬币。第i+1行包含两个整数ci(1≤ci

    Output

    第一行为一个整数,表示收藏家最多能获得多少种之前还没有的硬币。 第二行为一个整数,表示在前一问的前提下,收藏家能购买的最贵的商品价格。
    设f[i]为买价格k-i的商品可得到的不同的之前还没有的硬币数,则f[0]=0,f[i]=f[i%a]+b,其中i>0,a为面值不超过i的最大面值硬币,b为其是否之前还没有
    观察f[i]的性质,可知f[i]的前缀最大值有O(n)次突变,且每次增加1,因此可以维护这些突变点,最后一个突变点就对应了答案
    从小到大枚举硬币面值,更新时只需考虑上一个突变点与当前硬币能否得到一个新的突变点
    #include<cstdio>
    #include<algorithm>int _(){
        int x=0,c=getchar();
        while(c<48)c=getchar();
        while(c>47)x=x*10+c-48,c=getchar();
        return x;
    }
    struct item{
        int x,d;
    }v[500007];
    bool operator<(const item&a,const item&b){
        return a.x<b.x;
    }
    int n,k,ps[500007],pp=0;
    int main(){
        n=_();k=_();
        for(int i=0;i<n;++i)v[i].x=_(),v[i].d=!_();
        std::sort(v,v+n);
        v[n].x=k;
        for(int i=0,a;i<n;++i)if(v[i].d){
            a=v[i].x+ps[pp];
            if(a<v[i+1].x)ps[++pp]=a;
        }
        if(!pp)ps[pp]=1;
        printf("%d
    %d
    ",pp,k-ps[pp]);
        return 0;
    }
  • 相关阅读:
    【CSS】CSS 页面布局:盒子模型(内容区、边框、内边距、外边距)
    压缩/解压文件
    WebApiClient.JIT
    并行+异步执行操作
    JSON输出时不输出某些属性值
    ASP.NET MVC中Filter过滤器的使用
    使用git克隆github上的项目失败,报错error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
    C# 实现WebSocket通信
    写日志
    list随机生成数值
  • 原文地址:https://www.cnblogs.com/ccz181078/p/6065420.html
Copyright © 2011-2022 走看看