3.20 拼多多笔试
前三题A,第四题不会,特例通过16%
第一题,数组排序后直接求解即可
public class PDD_01 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); int[] a=new int[n]; int[] b=new int[n]; for(int i=0;i<n;i++) a[i]=in.nextInt(); for(int i=0;i<n;i++) b[i]=in.nextInt(); System.out.println(minSum(a,b)); } public static long minSum(int[] a,int[] b){ Arrays.sort(a); Arrays.sort(b); long sum=0; for(int i=0;i<a.length;i++){ sum+=(a[i]-b[i])*(a[i]-b[i]); } return sum; } }第二题 贪心+排序 注意题目要求
public class PDD_02 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int T=in.nextInt(); for(int i=0;i<T;i++){ int n=in.nextInt(); int v=in.nextInt(); int[][] lemons=new int[n][3]; for(int j=0;j<n;j++){ for(int k=0;k<3;k++) lemons[j][k]=in.nextInt(); } System.out.println(maxCollection(lemons, v)); } } public static int maxCollection(int[][] lemons,int maxCollect){ Arrays.sort(lemons, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { if(o1[2]!=o2[2]) return o1[2]-o2[2]; else return o1[1]-o2[1]; } }); int maxDay=lemons[lemons.length-1][2]; int lemonCount=0; int collect; for(int i=0;i<maxDay;i++){ int day=i+1; collect=maxCollect; for(int[] lemon:lemons){ if(lemon[0]<=0) continue; if(lemon[1]>day) continue; if(day>lemon[2]) continue; if(lemon[0]>=collect) { lemon[0]-=collect; lemonCount+=collect; break; } else{ lemonCount+=lemon[0]; collect-=lemon[0]; lemon[0]=0; } } } return lemonCount; } }第三题 最开始也只通过了38% 是因为没有考虑到特例,
为了保证字典序最小,默认a i+k为1,三种特殊情况
1.i+k越界
2.b i+2k 为0
3.a i-k已经为1了
这三种情况下,设置a i-k为1
public class PDD_03 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int k=in.nextInt(); in.nextLine(); String s=in.nextLine(); char[] A=new char[s.length()]; for(int i=0;i<s.length();i++) A[i]='0'; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='1'){ if(i+k>=s.length()) A[i-k]='1'; else if(i+2*k<s.length()&&s.charAt(i+2*k)=='0') A[i-k]='1'; else if(i-k>=0&&A[i-k]=='1') ; else A[i+k]='1'; } } System.out.println(String.copyValueOf(A)); } }