1263: 零用钱
时间限制: 1 Sec 内存限制: 128 MB提交: 2 解决: 2
[ 提交][ 状态][ 讨论版]
题目描述
作為创造產奶纪录的回报,Farmer John决定开始每个星期给Bessie一点零花钱。 FJ有一些硬币,一共有N (1 < = N < = 20)种不同的面额。每一个面额都能整除所有比它大的面额。 他想用给定的硬币的集合,每个星期至少给Bessie某个零花钱的数目C (1 < = C < = 100000000)。请帮他计算他最多能支付多少个星期的零花钱。
输入
* 第一行: 两个由空格隔开的整数: N 和 C * 第2到第N+1行: 每一行有两个整数表示一个面额的硬币:硬币面额V (1 < = V < = 100,000,000)和Farmer John拥有的该面额的硬币数B (1 < = B < = 1,000,000).
输出
* 第一行: 一个单独的整数,表示Farmer John最多能给Bessie支付多少个星期至少為C的零用钱。
样例输入
3 6
10 1
1 100
5 120
样例输出
111
提示
FJ想要每个星期给Bessie六美分。他有100个1美分硬币,120个5美分硬币,和一个10美分硬币。 FJ可以在一个星期超额付给Bessie一个10美分硬币。然后接下来的10个星期每星期付给 Bessie两个5美分硬币。最后100个星期每星期付给Bessie一个1美分硬币跟一个5美分硬 币。
这道题不做任何解释,提示的已经很明显了
#include<iostream>
#include<cstdio>
#include<algorithm>
using
namespace
std;
struct
node
{
int
val;
int
num;
}a[100];
bool
cmp(node x,node y)
{
return
x.val<y.val;
}
int
main()
{
int
n,c;
scanf
(
"%d %d"
,&n,&c);
for
(
int
i=1;i<=n;i++)
scanf
(
"%d %d"
,&a[i].val,&a[i].num);
sort(a+1,a+n+1,cmp);
int
cnt=0;
for
(n;a[n].val>=c;cnt+=a[n].num,n--);
int
flag=1;
while
(flag)
{
flag=0;
int
t=c;
for
(
int
i=n;i>=1;i--)
{
while
(a[i].num>0&&t>=a[i].val)
{
a[i].num--;
t-=a[i].val;
}
}
for
(
int
i=1;i<=n;i++)
{
while
(a[i].num>0&&t>0)
{
a[i].num--;
t-=a[i].val;
}
}
if
(t<=0)
cnt++,flag=1;
}
printf
(
"%d\n"
,cnt);
return
0;
}
//AC