2372: 给牛照相
Posted mjn1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于2372: 给牛照相的主要内容,如果未能解决你的问题,请参考以下文章
HIT2372 Recoup Traveling Expenses(最长单调子序列)