整数区间
传送门
题目描述
请编程完成以下任务:
1.读取闭区间的个数及它们的描述;
2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。
输入格式
输入到结束。接下来的 n n n行,每行包括两个整数 a , b a,b a,b,被一空格隔开, 0 ≤ a ≤ b ≤ 10000 0\le a\le b\le 10000 0≤a≤b≤10000,它们是某一个区间的开始值和结束值。
输出格式
第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。
样例 #1
样例输入 #1
3 6
2 4
0 2
4 7
样例输出 #1
2
以上来自信息学奥赛一本通 以上来自信息学奥赛一本通 以上来自信息学奥赛一本通
题意
找到最少的几个数能够包含于所有的区间。
解题思路
其实很easy,先对每个区间根据末尾的位置进行排序(从小到大)
inline bool cmp(project x, project y) {
if (x.ed == y.ed) {
return x.st < y.st;
}
return x.ed < y.ed;
}
然后从头开始,用上一个的末尾判断是否在下一个区间里,如果在,那么还是用上一个的末尾判断是否在下下一个区间里……, 如果不在,所需区间数目(ans)加一, 用不在的那个末尾继续判断。
tmp = -1;
for (int i = 1; i <= n; i++) {
if (a[i].st > tmp) {
ans++;
tmp = a[i].ed;
}
}
注意该题输入
inline void input() {
while (cin >> a[n + 1].st >> a[n + 1].ed) {
n++;
}
}
AC Code
// C++ includes used for precompiling -*- C++ -*-
// Copyright (C) 2003-2013 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <Licenses - GNU Project - Free Software Foundation>.
/** @file stdc++.h
* This is an implementation file for a precompiled header.
*/
// 17.4.1.2 Headers
// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
using namespace std;
#define int long long
const int Maxn = 10000 + 5;
int n;
struct project {
int st, ed;
} a[Maxn];
int tmp;
int ans;
inline void input() {
while (cin >> a[n + 1].st >> a[n + 1].ed) {
n++;
}
}
inline bool cmp(project x, project y) {
if (x.ed == y.ed) {
return x.st < y.st;
}
return x.ed < y.ed;
}
inline void work() {
input();
sort(a + 1, a + n + 1, cmp);
tmp = -1;
for (int i = 1; i <= n; i++) {
if (a[i].st > tmp) {
ans++;
tmp = a[i].ed;
}
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
work();
return 0;
}