牛客网---2016---百度罪犯转移

来源:互联网 发布:用js实现下拉菜单 编辑:程序博客网 时间:2024/06/05 11:33

兔子这边天气好热,已经想要裸奔了,教室的空调也不是特别凉爽,想去裸奔的我。。。

这里写图片描述

题目:
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
输入:
第一行数据三个整数: n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
输出:
一行输出答案。
示例:

输入3 100 21 2 3输出2

解析:
1. 虽然不知道什么是滑动窗口,但是简单理解下来, 就是一个固定大小的窗口一直在移动就好了。
解题所需函数:
1. 主要用到的就是Scanner里面的获取数据的方法nextInt(),还有就是用in.hasNext()来判断是否有下一结数据。
代码

import java.util.Scanner;public class Main{    // 主函数    public static void main(String[] args){        Scanner in=new Scanner(System.in);        // 我算是知道了in.hasNext是有多么好用        while(in.hasNext()){            int n = in.nextInt();            int t = in.nextInt();            int c = in.nextInt();            // 初始化数组,记录犯罪分数            int[] a = new int[n];            // 录入数据            for(int i = 0;i<n;i++){                a[i] = in.nextInt();            }            int count = 0;            int tempt = 0;            // 记录c项的和            for(int i = 0;i<c;i++){                tempt += a[i];            }            // 当tempt满足小于等于t这项条件时,麻烦计数君计数,谢谢            if(tempt<=t){                count++;            }            // 因为是连续的犯人,所以在此在加入下一项的同时,减去第一项,也就是i-c            for(int i = c;i<a.length;i++){                tempt = tempt+a[i]-a[i-c];                if(tempt<=t){                    count++;                }            }            System.out.println(count);        }    }}
原创粉丝点击