《TOJ5945》区间覆盖问题。

思路:贪心,按左边界递增,然后右边界递增.

不断扩大右边界。

主要细节多:

s可以到-1e6,r尽量开小.

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<double,double> pii;
const int N = 1e5+5;
const int M = 1e6+5;
const int Mod = 1e9+7;
#define pi acos(-1)
#define INF 1e8
#define INM INT_MIN
#define pb(a)  push_back(a)
#define mk(a,b) make_pair(a,b)
#define dbg(x) cout << "now this num is " << x << endl;
#define met0(axx) memset(axx,0,sizeof(axx));
#define metf(axx) memset(axx,-1,sizeof(axx));
#define sd(ax) scanf("%d",&ax)
#define sld(ax) scanf("%lld",&ax)
#define sldd(ax,bx) scanf("%lld %lld",&ax,&bx)
#define sdd(ax,bx) scanf("%d %d",&ax,&bx)
#define sddd(ax,bx,cx) scanf("%d %d %d",&ax,&bx,&cx)
#define sfd(ax) scanf("%lf",&ax)
#define sfdd(ax,bx) scanf("%lf %lf",&ax,&bx)
#define pr(a) printf("%d\n",a)
#define plr(a) printf("%lld\n",a)
struct Node{int L,r;}p[N];
bool cmp(Node a,Node b)
{
    if(a.L == b.L) return a.r < b.r;
    return a.L < b.L;
}
int main()
{
    int n,s,t;sddd(n,s,t);
    for(int i=1;i<=n;++i) sdd(p[i].L,p[i].r);
    sort(p+1,p+n+1,cmp);
    int L = s,r = -INF,ans = 0;
    for(int i=1;i<=n;++i)
    {
        if(p[i].r < L) continue;
        if(p[i].L > L)
        {
            ans++;
            L = r;
            if(r >= t) break;
            if(p[i].L <= L)    
            {
                r = max(r,p[i].r);
                if(r >= t) 
                {
                    ans++;
                    break;
                }
            }
            else break;
        }
        else 
        {
            r = max(r,p[i].r);
            if(r >= t) 
            {
                ans++;
                break;
            }   
        }
    }
    if(r < t) printf("No Solution\n");
    else pr(ans);
    system("pause");
    return 0;
}
View Code

给下调试数据:

case1:

3 1 10

-1 0

1 9

9 11

case 2:

1 10

1 5

6 9

9 11

原文地址:https://www.cnblogs.com/zwjzwj/p/12936618.html