罪犯转移问题

罪犯转移

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个,判断,以此类推,可以用两个不嵌套的循环替换我的嵌套循环,减少了时间复杂度。

膜拜!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值