# 【BZOJ】1685: [Usaco2005 Oct]Allowance 津贴（贪心）

http://www.lydsy.com/JudgeOnline/problem.php?id=1685

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

const int N=25;
int n, l, r;
int ans, c;
struct dat { int x, y; }a[N];
bool operator < (const dat &a, const dat &b) { return a.x<b.x; }

int sum=0;
for3(i, r, l) {
int t=(c-sum)/a[i].x;
t=min(t, a[i].y);
sum+=t*a[i].x; a[i].y-=t;
if(sum==c) return 1;
}
if(sum==c) return 1;
while(a[l].y==0 && l<=r) ++l;
while(a[r].y==0 && l<=r) --r;
if(l>r) return 0;
while(l<=r && sum<c) {
int t=(c-sum+a[l].x-1)/a[l].x;
if(t<=a[l].y) { a[l].y-=t; return 1; }
else { sum+=a[l].y*a[l].x; a[l].y=0; ++l; }
}
if(sum<c) return 0;
return 1;
}
int main() {
sort(a+1, a+1+n);
l=1; r=n;
while(a[r].x>=c && l<=r) ans+=a[r].y, a[r].y=0, --r;
printf("%d", ans);
return 0;
}


## Description

As a reward for record milk production, Farmer John has decided to start paying Bessie the cow a small weekly allowance. FJ has a set of coins in N (1 <= N <= 20) different denominations, where each denomination of coin evenly divides the next-larger denomination (e.g., 1 cent coins, 5 cent coins, 10 cent coins, and 50 cent coins). Using the given set of coins, he would like to pay Bessie at least some given amount of money C (1 <= C <= 100,000,000) every week. Please help him compute the maximum number of weeks he can pay Bessie.

利用给定的这些硬币，他将要每周付给贝茜一定金额的津贴C(1≤C≤10^8)．
请帮他计算出他最多能给贝茜发几周的津贴．

## Input

第1行：2个用空格隔开的整数n和C.
第2到n+1行：每行两个整数表示一种币值的硬币．第一个整数V(I≤y≤10^8)，表示币值．

## Output

一个整数，表示约翰付给贝茜津贴得最多的周数．

3 6
10 1
1 1 00
5 1 20

111

## Source

posted @ 2014-09-13 22:59  iwtwiioi  阅读(288)  评论(1编辑  收藏  举报