二分

眼红的Medusa

题目描述

虽然 Miss Medusa 到了北京,领了科技创新奖,但是她还是觉得不满意。原因是:他发现很多人都和她一样获了科技创新奖,特别是其中的某些人,还获得了另一个奖项——特殊贡献奖。而越多的人获得了两个奖项,Miss Medusa就会越眼红。于是她决定统计有哪些人获得了两个奖项,来知道自己有多眼红。

输入格式

第一行两个整数 $n, m$,表示有 $n$ 个人获得科技创新奖,$m$ 个人获得特殊贡献奖。

第二行 $n$ 个正整数,表示获得科技创新奖的人的编号。

第三行 $m$ 个正整数,表示获得特殊贡献奖的人的编号。

输出格式

输出一行,为获得两个奖项的人的编号,按在科技创新奖获奖名单中的先后次序输出。

样例 #1

样例输入 #1

4 3
2 15 6 8
8 9 2

样例输出 #1

2 8

提示

对于 $60%$ 的数据,$0 \leq n, m \leq 1000$,获得奖项的人的编号 $\lt 2 \times 10^9$;

对于 $100%$ 的数据,$0 \leq n, m \leq 10^5$,获得奖项的人的编号 $\lt 2 \times 10^9$。

输入数据保证第二行任意两个数不同,第三行任意两个数不同。

代码

点击查看代码
#include<iostream>
#include <algorithm>
using namespace std;
#define MAX 100005

int main() {
	int a[MAX];
	int b[MAX];
	int n, m;//获两种奖项的人数
	cin >> n >> m;
	//分别存入编号
	for (int i = 0; i < n; i++) cin >> a[i];
	for (int i = 0; i < m; i++) cin >> b[i];
	sort(b, b+m);//排序,好用!
	for (int i = 0; i < n; i++) {
		int low = 0, high = m-1;
		while (low <= high) {
			int mid = (low + high) / 2;//取中间值
			if (b[mid] == a[i]) {
				cout << a[i] << " ";
				break;
			}
			else if (b[mid] < a[i])low = mid+1;
			else high = mid-1;
		}
	}
	return 0;
}
# 凌乱的yyy / 线段覆盖

题目背景

快 noip 了,yyy 很紧张!

题目描述

现在各大 oj 上有 $n$ 个比赛,每个比赛的开始、结束的时间点是知道的。

yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。

所以,他想知道他最多能参加几个比赛。

由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 $2$ 个及以上的比赛。

输入格式

第一行是一个整数 $n$,接下来 $n$ 行每行是 $2$ 个整数 $a_{i},b_{i}\ (a_{i}<b_{i})$,表示比赛开始、结束的时间。

输出格式

一个整数最多参加的比赛数目。

样例 #1

样例输入 #1

3
0 2
2 4
1 3

样例输出 #1

2

提示

  • 对于 $20%$ 的数据,$n \le 10$;
  • 对于 $50%$ 的数据,$n \le 10^3$;
  • 对于 $70%$ 的数据,$n \le 10^{5}$;
  • 对于 $100%$ 的数据,$1\le n \le 10^{6}$,$0 \le a_{i} < b_{i} \le 10^6$。
    代码
点击查看代码
#include<iostream>
#include <algorithm>
using namespace std;
#define MAX 2000000
typedef struct {
	int s, e;
}Comp;
bool isSmall(Comp a, Comp b) {
	return a.e < b.e;
}
Comp c[MAX];
int main() {
	int n;
	int min;
	cin >> n;
	//存入起始与终止时间
	for (int i = 1; i <= n; i++)
		cin >> c[i].s >> c[i].e;
	sort(c + 1, c + n + 1, isSmall);


	int now=c[1].e;//指向结束时间最早的比赛
	int cnt = 1;
	for (int i = 1; i <= n; i++) {
		if (c[i].s >= now) {
			now = c[i].e;//表示选择进行该比赛
			cnt++;
		}
	}
	cout << cnt;
	return 0; 
}
posted @ 2024-10-10 19:52  花落水无痕  阅读(37)  评论(0)    收藏  举报