# | 题目 |
---|---|
A | 【NOIP2019模拟赛19.8.22】指引 |
B | 【NOIP2019模拟赛19.8.22】碎片 |
C | 【NOIP2019模拟赛19.8.22】寻梦 |
A. 【NOIP2019模拟赛19.8.22】指引
考试时想正解想了很久,最后还是打了暴力,95的暴力分真良心,,,
正解用到了神奇的set,把入口和旅客的坐标合在一起按照横坐标从大到小排序,然后从头开始遍历,如果是入口坐标就把纵坐标加入set,如果是旅客坐标就取出set中最小的那个>=当前旅客纵坐标的入口纵坐标,set刚好有这个功能,至于为什么,其实就是一种贪心策略,更大的纵坐标一定更有机会被后面的旅客选中,所以我们每次尽量把大的纵坐标留给后面
#include<bits/stdc++.h>
using namespace std;
int Num,n;
struct node{
int x,y,ip;
}p[200100];
set<int>q;
bool cmpy(node a,node b){
return a.x>b.x;
}
int main(){
// freopen("guide.in","r",stdin);
// freopen("guide.out","w",stdout);
scanf("%d%d",&Num,&n);
for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y),p[i].ip=1;
for(int i=1;i<=n;i++)scanf("%d%d",&p[i+n].x,&p[i+n].y),p[i+n].ip=2;
sort(p+1,p+2*n+1,cmpy);
int ans=0;
// for(int i=1;i<=2*n;i++)cout<<p[i].ip<<' '<<p[i].x<<' '<<p[i].y<<endl;
set<int>::iterator it;
for(int i=1;i<=2*n;i++){
if(p[i].ip==2)q.insert(p[i].y);
else if(q.size()){
if((it=q.lower_bound(p[i].y))!=q.end()){
q.erase(q.lower_bound(p[i].y));
ans++;
}
}
}
printf("%d",ans);
return 0;
}
B. 【NOIP2019模拟赛19.8.21】失意
考试时猜了个结论,把字母转换成数字,求每一横排、每一竖列的和,如果和相等就可以把他们配对的,最后判断有没有落单的,考场打完代码居然过掉了全部样例还是很惊讶的,但心里还是觉得可能对于有些情况我的结论是错的,但还是赌了一把(只是觉得这道题暴力太难打了,,)居然拿了95,被卡掉的一个点刚好就是我那个结论的bug。
看了正解觉得真麻烦,,就在自己的代码上根据特殊情况改一改,就是遇到我结论处理不了的情况就爆搜一下。
既然不是正解那我还是不发代码了,,,
C. 【NOIP2019模拟赛19.8.21】孤独
考试时完全没有思路,就写了个random_shuffle混了14分
留坑,,,,