AcWing 782. 避嫌抢劫-java
原题链接
中等
作者:
单箭头
,
2019-05-14 22:40:20
,
所有人可见
,
阅读 995
java 代码
package com.company.ForTruth.拼夕夕;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.io.*;
public class 避嫌抢劫 {
static class bank{
int location,money;
public bank(int a,int b){
this.location=a;
this.money=b;
}
}
public static void main1(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),d=sc.nextInt();
bank[] banks=new bank[n];
for (int i=0;i<n;i++){
banks[i]=new bank(sc.nextInt(),sc.nextInt());
}
int res=0;
for(int i=0;i<banks.length;i++){
for(int j=i+1;j<banks.length;j++){
if(Math.abs(banks[i].location-banks[j].location)>=d)
res=Math.max(res,banks[i].money+banks[j].money);
}
}
System.out.println(res);
}
public static void main2(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), d = sc.nextInt();
bank[] banks = new bank[n];
for (int i = 0; i < n; i++) {
banks[i] = new bank(sc.nextInt(), sc.nextInt());
}
int res=0,curMax = 0, j = -1;
Arrays.sort(banks, Comparator.comparing(bank -> bank.location));
for(int i=0;i<banks.length;++i){
while (j+1<i && Math.abs(banks[i].location-banks[j+1].location)>=d){
++j;
curMax = Math.max(curMax, banks[j].money);
}
res = Math.max(res, curMax + banks[i].money);
}
System.out.println(res);
}
private static int[] stringToint(String input) {
String[] parts = input.trim().split(" ");
int[] output = new int[parts.length];
for (int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] firstLine = stringToint(br.readLine().trim());
int n = firstLine[0], d = firstLine[1];
bank[] banks = new bank[n];
for (int i = 0; i < n; ++i) {
String line = br.readLine();
if (line == null || line.length() == 0)
break;
int[] num = stringToint(line);
banks[i] = new bank(num[0], num[1]);
}
int res=0,curMax = 0, j = -1;
Arrays.sort(banks, Comparator.comparing(bank -> bank.location));
for(int i=0;i<banks.length;++i){
while (j+1<i && Math.abs(banks[i].location-banks[j+1].location)>=d){
++j;
curMax = Math.max(curMax, banks[j].money);
}
res = Math.max(res, curMax + banks[i].money);
}
System.out.println(res);
}
}
你的双指针里面还可以再优化一下,当i取i+1之后,j只需从上次的最大值的位置往后取就行。
老哥,我用你的代码提交上去,还是超过时间限制,过不了啊
已经更新了主要原因是输入数据的读取导致的。