A和B是好友,他们经常在空闲时间聊天,A的空闲时间为[a1 ,b1 ],[a2 ,b2 ]..[ap ,bp ]。B的空闲时间是[c1 +t,d1 +t]..[cq +t,dq +t],这里t为B的起床时间。这些时间包括了边界点。B的起床时间为[l,r]的一个时刻。若一个起床时间能使两人在任一时刻聊天,那么这个时间就是合适的,问有多少个合适的起床时间?
第一行数据四个整数:p,q,l,r(1≤p,q≤50,0≤l≤r≤1000)。接下来p行数据每一行有一对整数ai,bi(0≤aii+1>bi,ci+1>di
输出答案个数
2 3 0 20 15 17 23 26 1 4 7 11 15 17
20
/* *滑动窗口,动态规划,最大两层循环 */ //2017-3-2 19:00start //有重叠即可,出题人描述有问题 //a用一个一维数组表示,符合a的时间段标1.如a有两个时间段15~17,23~26,则a[15]=a[16]=a[17]=1,...其余为0 //b同理,有时间为1,无为0 //a和b加起来,为2则重合 import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); while (sc.hasNext()){ int p=sc.nextInt(); int q=sc.nextInt(); int le=sc.nextInt(); int r=sc.nextInt(); sc.nextLine(); //接受p行作为A,先扫描出一个最大的数 int aMax = Integer.MIN_VALUE; int[][] aData=new int[p][2]; for(int i=0;i<p;i++){ String[] s=sc.nextLine().split(" "); aMax=Math.max(aMax,Integer.parseInt(s[1])); aData[i][0]=Integer.parseInt(s[0]); aData[i][1]=Integer.parseInt(s[1]); } int[] a = new int[aMax+1]; //比如最大60,a[60],即有长度61 for(int i=0;i<p;i++){ for(int j=aData[i][0];j<=aData[i][1];j++){ a[j]=1; //a的时间段为1 } } int[][] bData=new int[q][2]; for(int i=0;i<q;i++){ String[] s=sc.nextLine().split(" "); bData[i][0]=Integer.parseInt(s[0]); bData[i][1]=Integer.parseInt(s[1]); } int[] b = new int[aMax+1]; //比如最大60,a[60],即有长度61 for(int i=0;i<q;i++){ for(int j=bData[i][0];j<=Math.min(aMax,bData[i][1]);j++){ b[j]=1; //a的时间段为1 } } //以上的这些过程只是在无聊的存储数据罢了,a[]中存了0和1,b[]中存了0和1 int count=0; //这个双层循环才是核心,a不动,b滑动窗口 while(le<=r&&le<a.length){ for(int i=0;i+le<a.length;i++){ if(b[i]+a[i+le]==2){ count++; break; } } le++; } System.out.println(count); } } }
public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in) ; while (input.hasNext()){ int p = input.nextInt() ; int q = input.nextInt() ; int l = input.nextInt() ; int r = input.nextInt() ; int[][] a= new int[p][] ; int[][] b= new int[q][] ; for (int i = 0; i < p; i++) { a[i] = new int[2] ; a[i][0] = input.nextInt(); a[i][1] = input.nextInt() ; } for (int i = 0; i < q; i++) { b[i] = new int[2] ; b[i][0] = input.nextInt(); b[i][1] = input.nextInt() ; } int res = fun(p, a, q, b, l, r); System.out.println(res); } } //实现方法 public static int fun(int p, int[][] a, int q, int[][] b, int l, int r) { Set<Integer> hash = new HashSet<>(); //存放可行的t for (int i = 0; i < q; i++) { //对于b每个时间段 for (int j = 0; j < p; j++) { //配合a的每个时间段,有哪些t时间符合:相当于向右平移t距离使得和a有重合 int st = Math.max(0, a[j][0] - b[i][1]);//a的左端点-b的右端点,小于0则取0 int ed = Math.max(0, a[j][1] - b[i][0]);//a的右端点-b的左端点,小于0则取0 for (int k = Math.max(l, st); k <= Math.min(r, ed); k++) { //平移t不能超出[l,r]区间 hash.add(k); } } } return hash.size() ; } }
import java.util.*; public class Main { public static boolean isProper(int[][] A, int[][] B, int d) { for (int i = 0; i < A.length; ++i) { int a1 = A[i][0]; int a2 = A[i][1]; for (int j = 0; j < B.length; ++j) { int b1 = B[j][0]; int b2 = B[j][1]; if (b1 <= a2 && b2 >= a1) return true; } } return false; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int p = scanner.nextInt(); int q = scanner.nextInt(); int l = scanner.nextInt(); int r = scanner.nextInt(); int[][] A = new int[p][2]; int[][] B = new int[q][2]; for (int i = 0; i < p; ++i) { A[i][0] = scanner.nextInt(); A[i][1] = scanner.nextInt(); } for (int j = 0; j < q; ++j) { B[j][0] = scanner.nextInt(); B[j][1] = scanner.nextInt(); } int count = 0; for (int i = l; i <= r; ++i) { if (isProper(A, B, i)) { ++count; } } System.out.println(count); } } }土办法,暴力解题。这里只要有一个区间满足就可以对计数做加1。
public class freechat { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ int p=in.nextInt(); int q=in.nextInt(); int l=in.nextInt(); int r=in.nextInt(); int[][] a = new int[p][2]; int[][] b = new int[q][2]; for(int i=0;i<p;i++){ for(int j=0;j<2;j++){ a[i][j]=in.nextInt(); } } for(int i=0;i<q;i++){ for(int j=0;j<2;j++){ b[i][j]=in.nextInt(); } } int n=new freechat().getcount(p, q, l, r, a, b); System.out.println(n); } } public int getcount(int p,int q,int l,int r,int[][] a,int[][] b){ int num=0; for(int m=l;m<=r;m++){ mtiao:for(int i=0;i<q;i++){ for(int j=0;j<p;j++){ if((b[i][0]+m<=a[j][1])&&(b[i][1]+m>=a[j][0])){ num++; break mtiao; } } } } return num; } }