赛码网OJ题目--股神

来源:互联网 发布:中国it从业人数 编辑:程序博客网 时间:2024/05/17 07:51

 

1. 题目描述

 

2. 第一版

 

import java.util.Scanner;public class 股神 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int day;while (scanner.hasNext()) {day = scanner.nextInt();long time1 = System.currentTimeMillis();System.out.println(getMoney(day));long time2 = System.currentTimeMillis();System.out.println(time2-time1);}}public static int getMoney(int day){int total = 0;for (int i = 1; i <= day; i++) {if(isIncr(i)){total++;}else{total--;}}return total;}public static boolean isIncr(int day){int interval = 3;int temp = 3;while (temp<day) {temp += interval++;}if(temp==day){return false;}else{return true;}}}

 

结果发现:

Time Limit Exceeded

TLE

您的程序运行的时间已经超出了题目的时间限制。

问题就出在每个数字都要进行判断

比如10000000  结果是9991060  而所需时间是20467ms  20多秒才能计算出来

 

3. 第二版

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int day;while (scanner.hasNext()) {day = scanner.nextInt();long time1 = System.currentTimeMillis();System.out.println(getMoney(day));long time2 = System.currentTimeMillis();System.out.println(time2-time1);}}public static int getMoney(int day) {if(day==1){return 1;}else{int curr = 1;int cycleNum = 1;int total = 1;while (curr < day) {// 执行一个循环{// 第一个循环是 第二天 第三天// 第二个循环是 第四天 第五天 第六天...for (int i = 0; i < cycleNum; i++) {total++;curr++;if (curr == day) {return total;}}// 完成循环的最后一步total--;curr++;}if (curr == day) {return total;}cycleNum++;}return total;}}}

比如10000000  结果是9991060  而所需时间是7ms

4. 总结

算法优化是多么明显地带来计算效率的提升!

0 0
原创粉丝点击