2372: 给牛照相

2372: 给牛照相

时间限制: 1 Sec  内存限制: 128 MB
提交: 40  解决: 8
[提交][状态][讨论版][命题人:外部导入]

题目描述

农夫约翰想给他的N (2 <= N <= 1,000,000,000) 头牛照相,这些牛站成一排分别编号为1..N。每张照片可以拍摄连续的一些牛,并且约翰想让每头牛至少出现在一张照片上。
不幸的是有一些牛脾气不合,不想出现在同一张照片上,不合的牛有K(1 <= K <= 1000)对。给出这K对不合关系,算一下约翰最少需要拍多少张照片。

输入

第1行,两个整数N和K
第2到K+1行,每行两个数A和B,表示位置在A和B的两头牛不合,因此不能在同一张照片中。

输出

一个整数,表示约翰最少需要拍多少张照片数。

样例输入

7 3
1 3
2 4
5 6

样例输出

3

提示

约翰需要拍3张照片。

第一张拍1-2号牛

第二张拍3-5号牛

第三张拍6-7号牛
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct s
{
    int a1;
    int a2;
}a[1010];
bool cmp(const s & a, const s & b)
{
    return a.a1 < b.a1;
}
int main()
{
    int n, k, x, y;
    cin >> n >> k;
    for(int i = 0; i < k; ++i)
    {
        cin >> x >> y;
        a[i].a1 = x > y ? y : x;
        a[i].a2 = x > y ? x : y;
    }
    sort(a, a + k, cmp);
    int t = 0, sum = 1;
    int flag1, flag2;
    for(int i = t; i < k; i = t)
    {
        flag1 = a[i].a1;
        flag2 = a[i].a2;
        for(int j = i + 1; j < k; ++j)
        {
            if(a[j].a1 >= flag1 && a[j].a1 <= flag2)
            {
                flag1 = a[j].a1;
                flag2 = a[j].a2 > flag2 ? flag2 : a[j].a2;
                t = j;
            }
        }
        t++;
        sum++;
    }
    cout << sum << endl;
    return 0;
}

  

原文地址:https://www.cnblogs.com/mjn1/p/9866376.html