NOIP模拟赛乱搞AC贪心模拟匹配
Posted Reddest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP模拟赛乱搞AC贪心模拟匹配相关的知识,希望对你有一定的参考价值。
匹配
(match.pas/match.c/match.cpp)
【题目描述】
到了新的学期,Mcx痛苦的发现通用技术课居然是有实验课的,这样的话他就不得不放弃写作业的想法而去做一件类似于搭积木的事情。一次实验课上,他发现所给的材料有许许多多的长积木,其中黄色的有n条,第i条的长度为Ai;蓝色的有m条,第j条的长度为Bj。于是他想:这些积木可以组成多少对导轨呢?每对导轨由一条黄色积木和一条蓝色积木组成,每条积木只能用一次。为了美观,当且仅当Ai – x <= Bj <= Ai + y的时候,两条积木才能组成一对导轨。x,y为给定的非负整数。
【题目输入】
第一行四个数n,m,x,y,具体含义见题目描述。
第二行n个数,第i个数表示第i条黄色积木的长度,每两个数之间有一个空格。
第三行m个数,第i个数表示第i条蓝色积木的长度,每两个数之间有一个空格。
【题目输出】
仅一行一个非负整数,表示所能组成的导轨对数的最大值。
【样例输入】
5 3 0 0
1 2 3 3 4
1 3 5
【样例输出】
2
【样例解释】
样例中x,y均为0,故只有当Ai=Bj的时候才能组成一对导轨。
方案为第一条黄色积木和第一条蓝色积木一组,第二条蓝色积木和第三或第四条黄色积木一组。
【数据范围】
50%的数据满足1 <= n , m <= 1000
100%的数据满足 1 <= n , m <= 100000
100%的数据满足 0 <= x , y , Ai , Bi <= 10^9
100%的数据满足,Ai与Bi一定为升序排列。
【Solution】
千万别想复杂!!!!!千万别想复杂!!!!!千万别想复杂!!!!!
首先用两个指针L、R分别指向黄色积木当前砖块和蓝色积木当前砖块,初始指向第一个积木。如果当前黄色积木符合蓝色积木要求,则记录答案并使LR指针都往后移一位。如果当前蓝色积木长度比当前黄色积木长度减X还要小,那么只后移R指针。如果当前蓝色积木长度比当前黄色积木长度加Y还要大,那么之后移L指针。
AC代码:
1 #include <cstdio> 2 int N,M,X,Y,L=1,R=1; 3 int ylw[100010],ble[100010]; 4 long long ans; 5 int main(){ 6 scanf("%d%d%d%d",&N,&M,&X,&Y); 7 for(int i=1;i<=N;++i) scanf("%d",&ylw[i]); 8 for(int i=1;i<=M;++i) scanf("%d",&ble[i]); 9 while(L<=N&&R<=N){ 10 if(ble[R]>ylw[N]+Y||ble[M]<ylw[1]-X) break;//特判掉极端情况 11 if(ble[R]>=ylw[L]-X&&ble[R]<=ylw[L]+Y) {++ans;++L;++R;continue;} 12 if(ble[R]<ylw[L]-X) {++R;continue;} 13 if(ble[R]>ylw[L]+Y) {++L;continue;} 14 ++L; ++R; 15 } 16 printf("%I64d",ans); 17 return 0; 18 }
以上是关于NOIP模拟赛乱搞AC贪心模拟匹配的主要内容,如果未能解决你的问题,请参考以下文章