zoukankan      html  css  js  c++  java
  • P2376 [USACO09OCT]津贴Allowance

    题目背景

    作为学习刻苦、成绩优秀的回报,妈妈决定开始每个星期给杀马特一点零花钱。

    题目描述

    作为创造产奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱。

    FJ有一些硬币,一共有N (1 <= N <= 20)种不同的面额。每一个面额都能整除所有比它大的面额。

    他想用给定的硬币的集合,每个星期至少给Bessie某个零花钱的数目C (1 <= C <= 100000000)。请帮他计算他最多能支付多少个星期的零花钱。

    输入格式

    第1行: 两个由空格隔开的整数: N 和 C;

    第2到第N+1行: 每一行有两个整数表示一个面额的硬币:硬币面额V (1 <= V <= 100,000,000)拥有的该面额的硬币数B (1 <= B <= 1,000,000)。

    (感谢fyszzhouzj,现错误已改正)

    输出格式

    第1行: 一个单独的整数,表示最多能给支付多少个星期至少为C的零用钱。

    输入输出样例

    输入 #1
    3 6
    10 1
    1 100
    5 120
    输出 #1
    111

    说明/提示

    【样例说明】

    杀马特的妈妈想要每个星期给杀马特六美分。他有100个1美分硬币,120个5美分硬币,和一个10美分硬币。他妈妈可以在一个星期超额付给杀马特一个10美分硬币,然后接下来的10个星期每星期付给杀马特两个5美分硬币。最后100个星期每星期付给杀马特一个1美分硬币跟一个5美分硬币。

    分析:

    本题我们容易想到贪心,但是具体的思路较为难想。

    思路也就是:如果一个较大的数不够C,那么就取较小的补上,最后如果一定有浪费,那么就用最小的满足a[i].v>=nowc的代替即可。

    CODE:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int M=35;
    long long n,c;
    struct node{
        long long v,b;
    }a[M];
    long long get(){
        char c=getchar();
        long long res=0,f=1;
        while (c>'9'||c<'0'){
            if (c=='-') f=-1;
            c=getchar();
        }
        while (c<='9'&&c>='0'){
            res=(res<<3)+(res<<1)+c-'0';
            c=getchar();
        }
        return res*f;
    }
    long long ans;
    int now;
    bool cmp(node x,node y){return x.v>y.v;}
    int main(){
        n=get(),c=get();
        for (int i=1;i<=n;i++) a[i].v=get(),a[i].b=get();
        sort(a+1,a+n+1,cmp);
        for (int i=1;i<=n;i++)
            if (a[i].v>=c) ans+=a[i].b,now=i;
        while (1){
            long long nowc=c;
            for (int i=now+1;i<=n;i++){
                while (nowc>=a[i].v&&a[i].b>0){
                    nowc-=a[i].v;
                    a[i].b--;
                }
            }
            if (nowc<=0) {ans++;continue;}
            for (int i=n;i>now;i--)
                if (nowc<=a[i].v&&a[i].b>0) {nowc-=a[i].v;ans++;a[i].b--;break;}
            if (nowc>0) break;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    软件工程第六次作业
    软件工程第五次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    《CLSZS团队》:团队项目选题报告
    计算机软件工程 作业五
    计算机软件工程 作业四
    计算机软件工程 作业三
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11637477.html
Copyright © 2011-2022 走看看