求一段连续的子序列,使得子序列和的绝对值和x最接近 将所有前缀和排序,然后two pointers
import java.sql.Array;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
/**
* Main
*
* @author FD
* @date 2015/11/30 0030
*/
public class Main {
static class node {
int x, y;
public node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt(), m = scanner.nextInt();
if (n == 0 && m == 0) {
break;
}
int a[] = new int[n + 1];
node b[] = new node[n + 1];
b[0] = new node(0, 0);
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextInt();
a[i] += a[i - 1];
b[i] = new node(a[i], i);
}
Arrays.sort(b, 0, n+1, new Comparator<node>() {
@Override
public int compare(node o1, node o2) {
return o1.x - o2.x;
}
});
for(int i = 0; i <= n; i++)
//System.out.println(b[i].x+"*"+i);
while (m-- > 0) {
int x = scanner.nextInt();
int l = 0, r = 1, ans = Integer.MAX_VALUE;
int ansl = 0, ansr = 1;
while (l <= n && r <= n) {
int tmp = b[r].x - b[l].x;
//System.out.println(b[l].x+" "+ b[r].x+" "+ l +" "+r);
if (Math.abs(tmp - x) < Math.abs(ans-x)) {
ans = tmp;
ansl = b[l].y;
ansr = b[r].y;
}
if (tmp < x) {
r++;
} else if (tmp > x) {
l++;
} else
break;
if (l == r) {
r++;
}
}
if (ansl > ansr) {
int tmp = ansl;
ansl = ansr;
ansr = tmp;
}
ansl += 1;
System.out.println(ans + " " + ansl + " " + ansr);
}
}
}
}