信息学奥赛一本通 1324:【例6.6】整数区间 贪心算法

整数区间

传送门

题目描述

请编程完成以下任务:

1.读取闭区间的个数及它们的描述;

2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数。

输入格式

输入到结束。接下来的 n n n行,每行包括两个整数 a , b a,b a,b,被一空格隔开, 0 ≤ a ≤ b ≤ 10000 0\le a\le b\le 10000 0ab10000,它们是某一个区间的开始值和结束值。

输出格式

第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少。

样例 #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;
}
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值