罪犯转移问题

罪犯转移

C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?

输入描述:
第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
输出描述:
一行输出答案。

输入例子:
3 100 2
1 2 3

输出例子:
2

最开始我是这样做的,后来放到onlineJudge上提示我反应时间过长,我一看输入案例竟然有8万多个,要连续加2万多个,我这两个循环嵌套肯定时间较长啊。

package zhuanyifanren;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
System.out.println(“”);
        Scanner sc = new Scanner(System.in);
        
            int n = sc.nextInt();
            int t = sc.nextInt();
            int c = sc.nextInt();
            if(n>c){
            int[] a =new  int[n];
            
            for(int i = 0 ; i <n-c ;i++)
            {
                a[i]=sc.nextInt();
            }
            
            int sum = 0 ;

int count = 0;

           for(int i = 0;i<c ;i++)
            {
               for(int j = i ; j<i+c;j++)

{

sum+=a[i];

}              

if(sum>t)couint++;
            }
            
            System.out.println(sum);
            
            }
        
    }

}

测试完之后我开始怀疑这道题的出题人的智商,而且还有输入全部为空,竟然还有1万7个可能性,不过我看了大神的解答后,我开始怀疑我的智商了。

import java.util.Scanner;

public class Main {

public static void main(String args[])

{

Scanner ss=new Scanner(System.in);

        Main b=new Main();

while(ss.hasNext())

{

int n=ss.nextInt();

int t=ss.nextInt();

int c=ss.nextInt();

int data[]=new int[n];

for(int i=0;i<n;i++)

{

data[i]=ss.nextInt();

}

int result=b.number(data, c, t);

System.out.println(result);

}

}

public int number(int data[],int c,int t)

{

int result=0;

int temp=0;

if(c==data.length)

{

result=1;

}

else

{

for(int i=0;i<c;i++)

{

temp=temp+data[i];

}

if(temp<=t)

{

result++;

}

for(int i=c;i<data.length;i++)

{

temp=temp+data[i]-data[i-c];

if(temp<=t)

{

result++;

}

}

}

return result;

}

}

大神先计算了前c个数据的和,判断是否大于t。随后加第c+1个并减去第1个,判断,以此类推,可以用两个不嵌套的循环替换我的嵌套循环,减少了时间复杂度。

膜拜!

    原文作者:犯罪团伙问题
    原文地址: https://blog.csdn.net/lirui940403/article/details/48756141
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞