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