罪犯转移问题
2015-09-26 22:32
399 查看
罪犯转移
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
[b]输入描述:[/b]
[b]输出描述:[/b]
[b]输入例子:[/b]
[b]输出例子:[/b]
最开始我是这样做的,后来放到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);
}
}
}
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个,判断,以此类推,可以用两个不嵌套的循环替换我的嵌套循环,减少了时间复杂度。
膜拜!
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个,判断,以此类推,可以用两个不嵌套的循环替换我的嵌套循环,减少了时间复杂度。
膜拜!
相关文章推荐
- android xmlns res-auto 自定义 attr
- shell中if条件字符串、数字比对,[[ ]]和[ ]区别
- hdu5135 Little Zu Chongzhi's Triangles 状压dp
- unity官方demo学习之Stealth(一)
- 聊一下测试工程师的面试与招聘【转载自安大叔】
- 生日悖论的Python实现
- Docker之dockerfile
- ListView乱谈之ListView的滚动原理
- Java:i++问题(详细分析)
- 记提高服务接口可用性、稳定性注意事项总结
- LeetCode31 Next Permutation
- 2B The least round way
- http请求头
- jquery datatable 参数
- 平面几何相关 由调和四边形引出的一点点调和性质
- java正则表达式积累
- ALAssetsLibrary类实现查看相册列表,增加相册,保存图片到相册等功能
- Mysql数据表的优化
- leetcode002 Add Two Numbers
- 调整Mysql中insert、update、delete的顺序来以提高效率