您的位置:首页 > 其它

罪犯转移问题

2015-09-26 22:32 399 查看
罪犯转移

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

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


[b]输出描述:[/b]
一行输出答案。


[b]输入例子:[/b]
3 100 2
1 2 3


[b]输出例子:[/b]
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
;

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
;

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

膜拜!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: