罪犯转移问题

题目描述

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

解法一:这个解法是网友解法中赞最多的,也是一个群里好友提供的解法的思路
import java.util.Scanner;

public class Main {
    public static void main(String[] argc) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int N = input.nextInt();
            int MAX = input.nextInt();
            int C = input .nextInt();

            int[] arr = new int[N];
            int sum = 0,result = 0;
            for(int i=0;i<N;++i){
                arr[i] = input.nextInt();

                sum += arr[i];//在还没有循环进下边的if时,他表示的含义是前i项累加和,当循环进下边的if之后,这个sum每次在这里往后加一个,在下面的if里面把前面的减一个,这样这个sum一直包含的是c个数组元素的累加和(因为正好sum是前c个的累积和的时候进入到下边的循环的),
                if(i >= C-1){//不大于等于c-1,都不让进入这个循环来判断sum
                    if(i>=C)//这个是那种平常的状态
                        sum -= arr[i-C];//
                    if(sum <= MAX)//如果大于等于c-1,并且不大于等于c,那就说明是第一个长度为c的子串,判断这时候的sum就可以了
                        ++result;
                }
            }
            System.out.println(result);
       }
    }
}

这个解法比题后讨论的解法更好,在一个for循环中,添加了arr原始数组,生成的累加和不需要储存在一个变量中当时使用

具体思路:一直累计前n项,n从0开始,当这个n正好等于c的时候,说明他是最前边的那c个元素的和,直接比较她们的和是否大于t,

当继续向下循环的时候,每次的sum都等于sum和当前的arr里面的值相结合,再在if里面把前边的一个元素删掉  让sum还是包含c个元素的累加和

解法二:这个是我自己写的,更好理解一点,可是空间复杂度稍高。

思路:首先把前n项和保存进一个数组sum,不过这个数组包含n+1个元素,因为sum[0]表示前0个数的和为0,这样的话在后面要用到sum[j]-sum[j-c]的时候不需要考虑开始的那种特殊的情况,  这样每次用sum[j]-sum[j-c]  (j从c到n一共n-c+1种可能) 把结果和t相比较

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int count=0;
            int n = in.nextInt();//n个人
            int t = in.nextInt();//犯罪值和上限
            int c = in.nextInt();//连续c名
            int[] a = new int[n];

            for(int i = 0;i<n;i++){
                a[i] = in.nextInt();
            }
    int[] sum = new int[n+1];
        sum[0]=0;
            for(int i=1;i<=n;i++){
                sum[i]=sum[i-1]+a[i-1];
            }
            for(int j=c;j<=n;j++){
                 if((sum[j]-sum[j-c])<=t){
                    count++;
                }

            }

                    System.out.println(count);
        }

    }
}
时间: 2024-08-10 05:34:55

罪犯转移问题的相关文章

百度罪犯转移

题目描述 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代码: import java.u

[百度]罪犯转移

时间限制:1秒 空间限制:32768K 热度指数:34020 本题知识点: 动态规划 题目描述 C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重.现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式? 输入描述: 第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值a i (0≤a i ≤1e9) 输出描述: 一行输出答

百度在线笔试题-罪犯转移

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 // Java版本 import java.

盗取暗网罪犯特币,看黑客如何“黑吃黑”?

据外媒报道,黑客 Michael Richo 从暗网的罪犯账户中盗取比特币高达36.5万美元,这些"失主"吃了亏,也有苦说不出,总不能去报警是不是? 这个小伙是怎么操作的? 原来,一旦他获得了用户凭证的访问权限,登录访问用户的配置文件,就可以顺藤摸瓜地从与暗网市场相关联的钱包中窃取比特币. 这位黑客偷得还不少,光他自己承认的这部分金额就超过 36.5 万美元,他家里的电脑上有超过 1 万个这样的被盗凭证. Richo 采用两种技术来实施钓鱼计划: 第一种技术看上去其实很简单:他在暗网市

部署AlwaysOn第一步:搭建Windows服务器故障转移集群

在Windows Server 2012 R2 DataCenter 环境中搭建集群之前,首先要对Windows服务器故障转移集群(Windows Server Failover Cluster,简称WSFC)有基本的了解.WSFC必须部署在域管理环境中,由多台服务器组成,每台服务器称作一个"结点"(Node),每个结点上都运行了Windows服务器故障转移集群服务,整个集群系统允许部分结点掉线.故障或损坏而不影响整个系统的正常运作.集群自动检测结点的健康状态,一旦活跃结点发生异常,变

MySQL 分区表原理及数据备份转移实战

1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 2.分区表优点 1)分区表更容易维护.对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有

再见!春节红包大战隐退是策略转移

对于近两三年的春节来说,大众印象最深刻的不是美酒佳肴.无聊春晚.鞭炮礼花啥的,而是以排山倒海之势袭来的红包雨.支付宝.微信支付都在春节时刻不断发力,以发红包的方式承包了大众春节的大部分娱乐时间.但在今年,支付宝和微信似乎是有了心灵感应一般,都表示不会再在春节期间展开红包大战,这是否就意味着以后我们就要与其说再见了? 但细细看支付宝.微信支付近来的动作却不难发现,春节红包大战的隐退实际上只是一种策略上的转移.春节红包对它们来说已经完成了既定的开拓移动支付应用场景的任务,但这并不意味着春节红包就真地

Xen-Server 实现单点故障转移 高可用(HA)

新建一个资源池(本处的池为服务器Xen-server池) 输入池 名称并为池添加新服务器,单击添加新服务器,添加我们安装好的xenserver(server1,server2,server3 IP分别为192.168.26.213,192.168.26.214,192.168.26.215). 添加成功后如图所示:(在server1上我们已经安装了两台虚拟服务器且用的存储设备为NFS共享存储) 接下来选中池sss再选择高可用设置选项卡. 打开配置高可用性对话框对一些参数根据需要进行设置,最后确认

ESXI-P2V-V2V-应用虚拟化-在线转移

P2V-V2V-虚拟化应用 实战背景: 1.由于企业采购财务软件T3暂不支持win10 . 2.一台计算机无法安装多个版本T3客户端,从而实现对T3服务器的访问操作. 3.财务软件U8和T3安装在同一台电脑安装上存在兼容性问题. 解决方案:在现有ESXI平台上创建多台虚拟机(2003),在虚拟系统中安装各版本T3客户端,然后再安装易速联虚拟化应用软件服务器端,在用户端(财务电脑)安装异速联客户端软件,连接服务器实现对各T3服务器访问操作过程. EXSI现有平台:  操作步骤: 1.在ESXI平台