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",