问题描述
JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。
在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。
这些石子很漂亮,JiaoShou决定以此为礼物。
但是这N个石子被施加了一种特殊的魔法。
如果要取走石子,必须按照以下的规则去取。
每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。
由于时间紧迫,Jiaoshou只能取一次。
现在JiaoShou找到了聪明的你,问他最多可以带走多少个石子。
输入格式
第一行两个整数N、S。
第二行N个整数,用空格隔开,表示每个石子的重量。
输出格式
第一行输出一个数表示JiaoShou最多能取走多少个石子。
样列输入
8 3
1 1 1 1 1 1 1 1
样列输出
6
样列解释
任意选择连续的6个1即可。
数据规模和约定
对于20%的数据:N<=1000
对于70%的数据:N<=100,000
对于100%的数据:N<=1000,000,S<=10^12,每个石子的重量小于等于10^9,且非负
import java.util.Scanner;
public class present {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int[] num = new int[n];
for (int i = 0;i<n;i++){
num[i] = sc.nextInt();
}
int max = 0;
boolean bool = false;
for (int k = n/2; k >= 0; k--) {//先使能拿的石子最多为n/2
int m = 0;//这一轮从下标为0开始往后取2*k个石子判断是否符合条件
while (m+2*k<=n){//判断从下标为m开始后面的元素是否达到2*k个
int sum1 = 0;//前k个元素的和
int sum2 = 0;//后k个元素的和
for (int j = m;j<k+m;j++){
sum1 += num[j];
}
for (int j = m+k;j<2*k+m;j++){
sum2+= num[j];
}
if (sum1<= s && sum2 <= s) {//判断是否符合条件
max = 2*k;//因为这个循环中k是递减的,所以第一次符合条件时即为答案
bool = true;
System.out.println(max);
break;
}
m++;
}
if (bool == true){//此时已经找到了最佳答案,可以直接退出循环
break;
}
}
}