题目
题目描述:FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
第一行一个正整数n。
表示笔记本的数量。接下来n行,每行两个正整数Mi,Si表示这款笔记本的内存和速度。
n≤105,Mi,Si≤109
一行,一个正整数,表示被完虐的笔记本数。
解析
知识点
- 这道题主要的考点就是:简单排序,但是这题数据比较弱,暴力都可以暴力出来。
暴力求解
- 这道题暴力起来完全不难:就是去判断每一个点是不是一个fw的点。
- 所以对于每个点去遍历一下所有的点就好了。判断了自己是fw就退出来。
- 嗯,就没了。
排序求解
- 排序求解有什么好的?就是一个优雅一点的暴力而已咯。
- 我们排序就按照其中一个排序就行了(我们假设两个因素称为A和B)。
- A排好序之后呢,我们这个序列就有了一个特点,就是后面的所有物品的A值都比前面的废物。
- 所有相当于我们现在只要知道某一个物品的B值,ta比排序在ta前面的物品的B值fw,他就是fw(为什么要是前面的呢?因为只有前面的A值是不fw的呀)。
- 嗯,就这样。
算法操作
- 那怎么操作?这个简单,只要用一个变量经存下来已比遍历过的最大B值,和当前B值比较一下就好了。
看我代码
- 输入。
- 排序。
- 遍历。
- 输出。
AC代码(暴力枚举)
#include <iostream> #include <utility> using namespace std; #define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //代码预处理区 const int MAX = 1e5 + 7; pair<int, int> info[MAX]; //全局变量区 int main() { IOS; int n; cin >> n; for (int i = 1; i <= n; i++) cin >> info[i].first >> info[i].second; //输入数据 int cnt = 0; for (int i = 1; i <= n; i++) { //循环遍历每个节点,判断他是不是fw int M = info[i].first, S = info[i].second; for (int j = 1; j <= n; j++)//循环遍历其他点,证明他是不是fw if (i != j && M <= info[j].first && S <= info[j].second) { cnt++; break; } } //统计被完虐的数量 cout << cnt << endl; //输出 return 0; } //函数区
AC代码(简单排序)
#include <iostream> #include <algorithm> #include <utility> using namespace std; #define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //代码预处理区 const int MAX = 1e5 + 7; pair<int, int> info[MAX]; //全局变量区 bool cmp(const pair<int, int>& u, const pair<int, int>& v) { if (u.first == v.first) return u.second > v.second; return u.first > v.first; } //函数预定义区 int main() { IOS; int n; cin >> n; for (int i = 1; i <= n; i++) cin >> info[i].first >> info[i].second; //输入数据 sort(info + 1, info + 1 + n, cmp); //排序 int cnt = 0, mx = info[1].second; for (int i = 2; i <= n; i++) { if (mx < info[i].second) mx = info[i].second; else cnt++; } //统计被完虐的数量 cout << cnt << endl; //输出 return 0; } //函数区