贪心2合集
青藤oj #30007. 「一本通 1.1 练习 3」线段
题目描述
数轴上有 n条线段,选取其中 k条线段使得这 k条线段两两没有重合部分,问k 最大为多少。
输入格式
第一行为一个正整数n;
在接下来的n
行中,每行有 2个数ai,bi ,描述每条线段。
输出格式
输出一个整数,为k 的最大值。
思路
e…这题就是活动安排,该一下变量大小就AC了。。。
代码
#include <bits/stdc++.h>
using namespace std;
int beginn[1000001], endd[10000001];
int n, sum = 0;
void qsort(int, int);
void slove();
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &beginn[i], &endd[i]);
}
qsort(1, n);
slove();
return 0;
}
void qsort(int x, int y) {
int l = x, r = y, m = endd[(x + y) / 2];
while (l <= r) {
while (endd[l] < m) l++;
while (endd[r] > m) r--;
if (l <= r) {
int m = endd[l];
endd[l] = endd[r];
endd[r] = m;
int n = beginn[l];
beginn[l] = beginn[r];
beginn[r] = n;
l++;
r--;
}
}
if (l < y)
qsort(l, y);
if (r > x)
qsort(x, r);
}
void slove() {
int lastt = -1;
for (int i = 1; i <= n; i++) {
if (beginn[i] >= lastt) {
sum++;
lastt = endd[i];
}
}
printf("%d", sum);
}
青藤oj #30002. 「一本通 1.1 例 3」喷水装置
题目描述
长L米,宽W米的草坪里装有 n个浇灌喷头。每个喷头都装在草坪中心线上(离两边各w/2米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。
请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头?
输入格式
输入包含若干组测试数据。
第一行一个整数T表示数据组数;
每组数据的第一行是整数n、 L和W;
接下来的n行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据所描述的情况)。
输出格式
对每组测试数据输出一个数字,表示要浇灌整块草坪所需喷头数目的最小值。如果所有喷头都打开也不能浇灌整块草坪,则输出-1。
思路
很明显的贪心问题,因为是一块草地,所以要考虑长和宽,宽的话只需要在输入数据的时候考虑一下半径,如果半径小于等于宽的二分之一就直接略过,在考虑长的时候不能以喷水的最长去考虑,要考虑和草地的交点