• 【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%的数据满足,AiBi一定为升序排列。

    【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 }
  • 相关阅读:
    druid的配置
    js学习(五)-全局函数和类内部函数区别
    js学习(四)- prototype原型对象
    js学习(三)-使用大括号({ })语法创建无类型对象
    js学习(一)-动态添加、修改、删除对象的属性和方法
    js学习(一)-对象和函数概念
    js关于函数和对象的概念
    js传递数组到后台
    ubantu一些资料
    fiddler的编程文章
  • 原文地址:https://www.cnblogs.com/reddest/p/5994898.html
Copyright © 2020-2023  润新知