Poj-2376 Cleaning Shifts

[题目链接]

思路:贪心策略,每一次选择结束时间尽可能远的牛牛,无限WA~哭哭~~

测试样例:
2 10
1 5
6 10 // 输出2
1 10
2 10 //输出-1
3 10
1 5
3 12
5 10 //输出2

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<functional>
#include<algorithm>
using namespace std;
typedef pair<int,int>P;
const int inf=0x3f3f3f3f;
const int Max_n=1e5+10;

int n,t;
P a[Max_n];

int main()
{
    scanf("%d%d",&n,&t);
    for(int i=0;i<n;i++)
        scanf("%d%d",&a[i].first,&a[i].second);
    a[n].first=t+1;a[n].second=inf; //处理边界
    sort(a,a+n+1);
    if(a[0].first!=1){printf("-1\n");return 0;} //起点特判
    int sum=1,t=a[0].second,k=t;
    for(int i=1;i<=n;i++){
        if(a[i].first<=t+1)k=max(k,a[i].second);
        else {
            if(k+1<a[i].first){printf("-1\n");return 0;}
            sum++;t=k;k=a[i].second;
        }
    }
    printf("%d\n",sum);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/80193094