眼红的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;
}
题目背景
快 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;
}