蓝桥杯印章

问题描述

  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;
            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值