H - Protecting the Flowers POJ - 3262 贪心

本文解析了一道经典的算法题目——牛吃草问题。通过合理的排序策略来最小化所有牛吃草的总量,介绍了具体的实现思路及C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://poj.org/problem?id=3262

题意:n头牛在吃草,每秒吃di,你要驱赶这些牛,驱赶的时间2*ti,求怎么赶走全部牛,使总共吃最少的草(牛从你开始赶它就不在吃草

看了题解才会。。。。。

设已经x时刻

两头牛,判断是否要交换赶牛的顺序

di,ti

dj,tj

先第i头在第j头

吃的草:x*di+(x+2*ti)*dj

先第j头在第i头

吃的草:x*dj+(x+2*tj)*di

两式减一下,ti*dj - tj*di

所以按照这个比值排序就可以了。。。。想复杂了。。。

#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<queue>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
long long sum;
struct node
{
	long long t,d,index;
	bool operator <(const node u)const
	{
		return t*u.d<u.t*d;
	}
	
}num[100005];
int main()
{
	int n;
	long long ans=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		scanf("%lld %lld",&num[i].t,&num[i].d);
	}
	sort(num,num+n);
	long long now=0;
	for(int i=0;i<n;i++)
	{
		ans+=now*num[i].d;
		now+=num[i].t;	
	}
	cout<<ans*2<<endl;
	return 0;
 }





### USACO 2007 January Silver Problem K11715 Protecting the Flowers 解析 #### 背景与问题描述 这是一道来自USACO 2007年1月银级的比赛题目,名为《保护花朵》[^1]。在这个场景中,Farmer John有N头奶牛正在践踏他的花园里的花丛。每头奶牛有一个特定的时间t_i离开花园,并且会破坏a_i朵花直到它被赶走。 为了最小化损失,FJ可以在任意时刻选择一头或多头奶牛并将其驱逐出花园。然而每次行动都会消耗一定的能量值E。因此目标是在总能量消耗不超过给定的最大允许值M的情况下,使最终剩余未受损的花朵数量最大化。 #### 思路分析 此题属于典型的贪心算法应用案例之一。核心在于如何合理安排驱逐顺序来达到最优解: - 对于每一组(t, a),即某只奶牛停留时间和其造成的损害程度; - 计算单位时间内该奶牛所造成的影响因子f=a/t; - 将所有影响因子按降序排列; - 根据排序后的列表依次处理各只奶牛,在满足能量预算的前提下尽可能早地移除那些高影响度个体以减少整体损害。 通过上述策略可以有效地降低总的花卉损坏量,从而实现最佳解决方案[^3]。 #### Python 实现代码 下面给出了一种基于Python语言的具体实现方式: ```python def protecting_the_flowers(cows, max_energy): # cows is list of tuples (time_to_leave, flowers_destroyed), max_energy is integer # Calculate destruction rate per unit time and sort by this value descendingly. sorted_cows = sorted([(flowers/float(time), i) for i, (time, flowers) in enumerate(cows)], reverse=True) total_saved = 0 used_energy = 0 while sorted_cows and used_energy + 1 <= max_energy: _, index = sorted_cows.pop(0) time, flowers = cows[index] if used_energy + 1 <= max_energy: total_saved += flowers used_energy += 1 return total_saved # Example usage: cows_data = [(10, 80), (20, 90)] # Each cow's leaving time and destroyed flowers count max_allowed_energy = 1 # Maximum allowed energy to use on chasing away cows print(f"Maximum saved flowers: {protecting_the_flowers(cows_data, max_allowed_energy)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值