POJ 3040(Allowance)

题目链接:http://poj.org/problem?id=3040

 

题意:将不同面值的金币分成x份,每份的数量至少为c ,  求x的最大值

 

思路:1. 面值大于 c 的只能单独为一份;

   2. 优先考虑取出面值较大的;

   3.取出面值较大的后考虑有小到的面值次序取出金币拼凑,直到刚好等于或超过 c ;

   4.直到剩下的金币不能拼凑成 c ;

 

ac代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;

int N,C,total=0,temp=0;
struct Coin{
    int mianzhi;
    int num;
}coins[25];

bool Cmp(const Coin& a,const Coin& b){
    return a.mianzhi>b.mianzhi;
}

int main(void){    
    cin>>N>>C;
    for(int i=0;i<N;i++){
        scanf("%d%d",&coins[i].mianzhi,&coins[i].num);
        // getchar();
    }
    sort(coins,coins+N,Cmp);

    // 选出面值大于或等于C的
    for(int i=0;i<N;i++){
        if(coins[i].mianzhi>=C){
            total+=coins[i].num;
            temp=i+1;
        }
        else    break;
    }

    // temp++;
    while(1){
        int now=0;
        for(int i=temp;i<N;i++){
            while(coins[i].num>0&&now+coins[i].mianzhi<=C){
                now+=coins[i].mianzhi;
                coins[i].num--;
            }
        }    
        for(int i=N-1;i>=temp;i--){
            while(now<C&&coins[i].num){
                coins[i].num--;
                now+=coins[i].mianzhi;
            }
        }
        if(now<C)
            break;
        total++;        
    }
    cout<<total<<endl;

    return 0;
}
View Code

 

posted @ 2020-03-24 23:40  ジャスミン  阅读(164)  评论(0编辑  收藏  举报