利用贪心的思维对算法剪枝(POJ 2376)

一道ACM竞赛题目,农民需要雇佣奶牛工作,每头奶牛只能在特定日子工作。通过贪心算法,从第一天开始选择工作时间最长的奶牛,并按开始工作时间排序,用数组记录上一头奶牛的开始时间,减少遍历次数,优化算法解决复杂度问题。
摘要由CSDN通过智能技术生成

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

这是昨天遇到的一道题吧,题目的意思非常简单。一个农民在一些天里需要一些奶牛为他工作。他可以找到n头奶牛,但是,任意的一头奶牛都只有特定的日子里才能进行工作。所以,我们要计算得出他最少需要雇佣多少头奶牛。(如果不能天天都雇佣到奶牛即输出-1).

这题的思路十分简单,首先我们从第一天开始,找到一头工作时间最久的奶牛(设工作到n天),将其转化为规模更小的问题。然后继续寻找符合条件的工作时间最长的奶牛,直到时间结束。但是,这样做,就不得不联系遍历所有奶牛的数据,造成复杂度增大(TLE),所以,如何进行优化呢?首先,我们对奶牛根据其开始工作的时间进行排序。这样当确定工作开始的时间后,我们只需要遍历工作开始时间小于start的时间。这样还不够,我们利用一个数组记录下上一头奶牛工作开始的时间,因为如果有奶牛工作时间早于上一头奶牛且工作时间更长,那么它才是上一段时间的最优解。由此我们就可以完成对这个算法的优化。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct cow
{
	int a, b;
}data[25005];
int start,endi,n,flag,previ[25005];
bool comp(cow a, cow b)
{
	if (a.a < b.a)return true;
	else return false;
}
int main()
{
	int i,temp1,temp2;
	while (scanf_s("%d %d",
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值