聊天----滑动窗口

A的空闲时间为[a1 ,b1 ]…[an ,bn ]。
B的空闲时间是[c1 +t,d1 +t]..[cn +t,dn +t],这里t为B的起床时间。这些时间包括了边界点。
B的起床时间为[l,r]的一个时刻。若一个起床时间能使两人聊天至少一次,那么这个时间就是合适的
输入描述:第一行数据四个整数:p,q,l,r(1≤p,q≤50,0≤l≤r≤1000)。接下来p行数据每一行有一对整数ai,bi,q行数据每一行有一对整数ci,di
输出描述:合适的起床时间个数
输入例子:
2 3 0 20
15 17
23 26
1 4
7 11
15 17
输出例子:20

public class Main {
    public static void main(String[] args){
        Scanner in= new Scanner(System.in);
        int p=in.nextInt();//A的空闲时间段数
        int q=in.nextInt();//B的空闲时间段数
        int l=in.nextInt();//起床时间起点
        int r=in.nextInt();//起床时间终点
        int maxA=Integer.MIN_VALUE;
        int maxB=Integer.MIN_VALUE;
        int A[][]=new int[p][2];
        int B[][]=new int[q][2];
        for(int i=0;i<p;i++){
            A[i][0]=in.nextInt();
            A[i][1]=in.nextInt();
            maxA=Math.max(maxA,A[i][1]);//找到A最后的空闲时间
        }
        for(int i=0;i<q;i++){
            B[i][0]=in.nextInt();
            B[i][1]=in.nextInt();
            maxB=Math.max(maxB,B[i][1]);//找到B最后的空闲时间
        }
        in.close();
        boolean a[]=new boolean[maxA+1];//A的空闲时间点
        boolean b[]=new boolean[maxB+1];//B起床时间为0时的空闲时间点
        for(int i=0;i<p;i++){
            for(int j=A[i][0];j<=A[i][1];j++){
                a[j]=true;
            }
        }
        for(int i=0;i<q;i++){
            for(int j=B[i][0];j<=B[i][1];j++){
                b[j]=true;
            }
        }
        int count=0;
        /*滑动窗口
         * 若b起床时间为1,a需要右移1;b起床时间为n,a需要右移n
         * 因此a向右滑动窗口,b不动
         */
        for(int k=l;k<=r;k++){
            for(int i=0;i<=maxB&&k+i<=maxA;i++){//防越界
                if(b[i]&&a[i+k]){//两个集合存在交点。
                    count++;
                    break;
                }
            }
        }
        System.out.println(count);
    }        
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值