USACO-Section1.2 Milking Cows [线段树]

2017-5-23
题目大意:

读入N个农民(1 <= N <= 5000)挤N头牛的工作时间列表,
求最长至少有一人在挤奶的时间段。
最长的无人挤奶的时间段。(从有人挤奶开始算起)

样例输入:

3
300 1000
700 1200
1500 2100

样例输出:

900 300

题解:

排序解决。按照农名开始挤牛奶的时间进行排序,问题转化为三个子问题,即三种情况。用start 和 end 标记目前时间段
1、后一个农名的开始和结束时间都在标记时间段内,则挤牛奶时间和没人挤牛奶时间均不受影响,标记点不变。
2、后一个农名的开始时间在标记时间段内,结束在为,挤牛奶时间加长,没人挤牛奶时间不变,改变end点。
3、后一个农名的开始时间不在时间段内,则出现空时间,改变标记点。

代码:

C++
/*
    ID: mujinui1
    PROG: milk2
    LANG: C++
*/
#include <iostream>
#include<fstream>
#include <algorithm>
#define N 5001

using namespace std;
int start[5001],end[5001];
int main(){  
    ofstream fout ("milk2.out");
    ifstream fin ("milk2.in");
    int n;
    fin>>n;
    for(int i=0;i<n;i++){
        fin>>start[i]>>end[i];
    }   

     for(int i=0;i<n-1;i++){
        for(int j=i;j<n;j++){
            if(start[i]>start[j]){
                int temp;
                temp=start[i];
                start[i]=start[j];
                start[j]=temp;
                temp=end[i];
                end[i]=end[j];
                end[j]=temp;
            }
        }
    }
//    for(int i=0;i<n;i++){
//      fout<<start[i]<<" "<<end[i]<<endl;
//    }
    int mark1,mark2,yes=0,no=0;
    mark1=0,mark2=0;
    yes=end[0]-start[0];
    for(int i=1;i<n;i++){
        //wan quan bao han
        if(end[i]<end[mark2]){
            //mark2=i;yes=max(yes,end[mark2]-yes[mark1]);
        }
        //bu wan quan
        if(start[i]<=end[mark2]&&end[i]>end[mark2]){
            mark2=i;yes=max(yes,end[mark2]-start[mark1]);
        }
        // wan quan bu
        if(start[i]>end[mark2]){
            yes=max(yes,end[mark2]-start[mark1]);
            no=max(no,start[i]-end[mark2]);
            mark1=i,mark2=i;
        }
    }
    fout<<yes<<" "<<no<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值