您的位置:首页 > 其它

盗梦空间 ---- 南阳OJ(语言入门)

2017-09-10 22:37 267 查看

                                                                                       盗梦空间

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述
《盗梦空间》是一部精彩的影片,在这部电影里,Cobb等人可以进入梦境之中,梦境里的时间会比现实中的时间过得快得多,这里假设现实中的3分钟,在梦里就是1小时。

然而,Cobb他们利用强效镇静剂,可以从第一层梦境进入第二层梦境,甚至进入三层,四层梦境,每层梦境都会产生同样的时间加速效果。那么现在给你Cobb在各层梦境中经历的时间,你能算出现实世界过了多长时间吗?

比如,Cobb先在第一层梦境待了1个小时,又在第二层梦境里待了1天,之后,返回第一层梦境之后立刻返回了现实。

那么在现实世界里,其实过了396秒(6.6分钟)

输入第一行输入一个整数T(0<=T<=100),表示测试数据的组数。

每组测试数据的第一行是一个数字M(3<=M<=100)

随后的M行每行的开头是一个字符串,该字符串如果是"IN" 则Cobb向更深层的梦境出发了,如果是字符串"OUT"则表示Cobb从深层的梦回到了上一层。如果是首字符串是"STAY"则表示Cobb在该层梦境中停留了一段时间,本行随后将是一个整数S表示在该层停留了S分钟(1<=S<=10000000)。数据保证在现实世界中,时间过了整数秒。输出对于每组测试数据,输出现实世界过的时间(以秒为单位)。样例输入
1
6
IN
STAY 60
IN
STAY 1440
OUT
OUT

样例输出
396

来源通信兴趣小组选拨赛上传者
admin

  如下原题链接

 http://acm.nyist.net/JudgeOnline/problem.php?pid=125[/code]  

  下面是我的解法 :

                 根据计算 : 发现 当前层级 与 下一层级的时间比值是1 : 20 ;

                则有 :

                        如果遇见 IN

                               当前时间倍数  X 20

                        如果遇见STAY 

                             时间累加上 : 当前分钟数 * 60秒 / 当前时间倍数 

                        如果遇见OUT  :  

                             当前时间倍数 / 20;

如下代码 :

    

import java.util.*;
public class Main {

public static void main(String[] args) {
int T = 0;
int M = 0;
long time = 0;  //时间的总数
int beishu = 0; //代表当前时间的倍率
int stayTime = 0;
String str = null;
Scanner scan = new Scanner(System.in);
//输入总的测试数据
T = scan.nextInt();

//数据的测试组数的循环
while((T--)!=0){
//输入M
beishu = 1;
time =  0;    //累计时间
M = scan.nextInt();
do{
str = scan.next();
if(str.equals("IN")){          //进入下一层,倍率提升20倍
beishu *=20;

}else if(str.equals("STAY")){  //留在该层
stayTime = scan.nextInt();
time +=(long)stayTime*60/beishu;  //小心L问题导致问题
}else{                         //退出这一层
beishu /=20;
}
}while((--M)!=0);

//输出累计的时间,转换成秒
System.out.println(time);

}

}

}


运行结果 : 

             时间 139ms         内存 : 311

其中观察发现一位同学的Java代码时间效率为 4   内存 为 61 ,明天总结一下这位同学的算法思路。。。。。。

如下将流换成带有缓冲功能的输入字符流 , 提升了一倍左右 。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {

public static void main(String[] args) throws NumberFormatException, IOException {
int T = 0;
int M = 0;
long time = 0;  //时间的总数
int beishu = 0; //代表当前时间的倍率
int stayTime = 0;
String str = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//输入总的测试数据
T = Integer.parseInt(reader.readLine());

//数据的测试组数的循环
while((T--)!=0){
//输入M
beishu = 1;
time =  0;    //累计时间
M = Integer.parseInt(reader.readLine());
do{
str = reader.readLine();
if(str.equals("IN")){          //进入下一层,倍率提升20倍
beishu *=20;

}else if(str.equals("OUT")){  //留在该层
beishu /=20;
}else{                         //退出这一层
stayTime = Integer.parseInt(str.split(" ")[1]);
time +=(long)stayTime*60/beishu;  //小心L问题导致问题

}
}while((--M)!=0);

//输出累计的时间,转换成秒
System.out.println(time);

}

}

}


运行结果 :

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