栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

P2376 [USACO09OCT]Allowance G

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

P2376 [USACO09OCT]Allowance G

[USACO09OCT]Allowance G - 洛谷

对于每一枚硬币,我们要使它对答案的贡献最大化或者尽量少地影响其他硬币的贡献最大化,我们需要分类讨论:

(1)这枚硬币的面额V>=C,那么直接用它支付一个星期的零花钱;

(2)这枚硬币的面额V<=C,那么,有两种情况:

①用它与其他硬币组合,支付一个星期的零花钱;

②不与任何硬币组合,直接报废。

【重点】硬币如何与其他硬币组合?

[探究1]我们希望面额尽量大的硬币得到更多的使用,这样对答案没有贡献的硬币面额会很小。

[探究2]根据[探究1],我们的贪心策略逐渐成型:

假设C'为凑齐一个星期的零花钱还剩多少钱?

(1)如果当前所有的面额都

(2)如果当前所有的面额有>=C',那么,我们选取面额尽量小的硬币。

#include 
using namespace std;
#define MAXN 25
int n,c,ans;
struct Node
{
	int v,b;
}a[MAXN];
bool cmp (Node p,Node q)
{
	return p.v>q.v;
}

void Init ()
{
	scanf ("%d %d",&n,&c);
	for (int i=1;i<=n;i++)
		scanf ("%d %d",&a[i].v,&a[i].b);
	sort (a+1,a+1+n,cmp);
}

void Work ()
{
	int k=1,ans=0;
	while (a[k].v>=c) ans+=a[k++].b;
	while (1)
	{
		int tmp=c;
		for (int i=k;i<=n;i++)
			while (tmp>=a[i].v && a[i].b>0 && tmp>0)
				{tmp-=a[i].v;a[i].b--;}
		if (tmp>0)
			for (int i=n;i>=k;i--)
				if (a[i].b>0)
				{
					tmp-=a[i].v;
					a[i].b--;
					break;
				}
		if (tmp<=0) ans++;else break;
	}
	printf ("%dn",ans);
}

int main ()
{
	Init ();
	Work ();
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286769.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号