题目描述
FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。 但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。 拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。 可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
输入描述:
第一行一个正整数n,表示笔记本的数量。接下来n行,每行两个正整数Mi,Si表示这款笔记本的内存和速度。n≤105,Mi,Si≤109
输出描述:
一行,一个正整数,表示被完虐的笔记本数。
输入
4
100 700
200 500
50 100
300 400
输出
1
题目大意
n个笔记本,如果笔记本的内存和速度都小于等于另外一个笔记本,则被完虐,求多少笔记本被完虐
思路
排序+max,注意不要理解成一个笔记本要小于所有笔记本
1.先排序a
2.再求出i后b的最大值c
3.如果i的b<i+1的c则被完虐
#include<bits/stdc++.h> using namespace std; struct date{ int a=0; int b=0; int c=0; }num[100005]; bool cmp(date a,date b){ if(a.a==b.a) { return a.b<b.b; }else return a.a<b.a; } int main() { int n,sum=0,maxn=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&num[i].a,&num[i].b); } sort(num,num+n,cmp); for(int i=n-1;i>=0;i--) { maxn=max(maxn,num[i].b); num[i].c=maxn; } for(int i=0;i<n;i++) { //printf("%d %d %d\n",num[i].a,num[i].b,num[i].c); if(num[i].b<=num[i+1].c) { sum++; } } printf("%d",sum); return 0; }