CodeChef Morning Commute错误答案

时间:2015-03-12 01:26:58

标签: java algorithm solution

以下是问题: 厨师每天都会乘坐城市的地下地铁去上班。火车的时间表最近已经改变,他想知道从离他家最近的车站和离他的餐馆最近的车站需要多长时间。 厨师不想改变他之前的路线,因此他只需要知道沿着他常规的路线到达他的餐馆需要多长时间。这条路线由一系列站点s0,s1,...,sn给出,其中s0是Chef进入地铁的站点,sn是Chef离开地铁站的站点。 列车计划在每两个连续站si-1和si之间运行。这样的时间表由三个整数xi,li和fi指定。这意味着该线路上的第一列火车开始在时间xi运行。这列火车从si-1和si出发的时间恰好是li单位。最后,火车在前一班火车后每隔几分钟从一个火车站出发。也就是说,火车在时间xi,xi + fi,xi + 2fi离开,依此类推。 厨师在驾驶地铁时非常有经验,因此他在给定车站之间转乘火车所需的时间基本上为零。因此,如果厨师到达车站,比如说si,从si到si + 1的火车计划离开的那一刻,他巧妙地在下一班火车上跳跃。但是,如果厨师到达时没有计划离开si + 1的火车,​​他必须等到预定的起飞时间。 帮助厨师弄清楚他需要多长时间才能从车站s0到车站sn。您可以假设Chef在0时已经在站s0。 输入

第一行由一个整数组成,表示测试用例的数量(最多50个)。每个测试用例都以包含1到1000之间的单个整数n的行开头,表示Chef必须遍历的行数(因此有n + 1个站s0,s1,...,sn)。接下来的n行描述了站之间的列车时刻表,每行一列。第i行给出了在站点si-1和si之间行进的列车的值xi,li和fi。 xi值介于0和1000之间,li和fi值介于1和1000之间。 输出

对于每个测试用例,您将输出一个整数,表示Chef可以使用给定路径到达站点sn的最小时间t。请记住,厨师在时间0开始于s0。 实施例

输入: 3 2 0 4 7 0 6 5 2 0 1 2 6 2 10 2 1 2 3 0 2 3

输出: 11 8 5

以下是问题的链接:http://www.codechef.com/problems/COMMUTE/

我尝试了多种解决方案,但无法弄清楚为什么Codechef会给我“错误答案”消息。请注意,我的程序产生了与Codechef中的示例输出相同的输出,我甚至编写了一些我自己的数字并插入它们,我的程序仍然给出正确的(我自己计算)结果。

我的思维过程是:

  • ----开始时间
  • ____旅行时间
  • ++++等待时间

在这种情况下,从station1到station2的所需时间是station2的开始时间+旅行时间:

------_____++++++
-----------------------____+++|+++|+++

在这种情况下,从station2到station3的所需时间是station3的开始时间,treveling时间和2个等待时间。

-----------------------____+++|+++|+++
-------______________++++|++++|++++|++++|

从station2到station3的总时间相同。因为它是线性的?

这是我的代码:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    int cases = in.nextInt();
    int n = 0;

    int [] t = new int [cases];
    for(int i = 0; i < cases; i++) {
        int stations = in.nextInt();
        int [] start = new int [stations];
        int [] travel = new int [stations];
        int [] gap = new int [stations];

        for(int j = 0; j < stations; j++) {
            start[j] = in.nextInt();
            travel[j] = in.nextInt();
            gap[j] = in.nextInt();
        }
        for(int j = 0; j < (stations-1); j++) {
            n = 0;
            if(j==0) {
                if(start[j] + travel[j] > start[j+1]+(n*gap[j+1])) {
                    while(start[j] + travel[j] > start[j+1]+(n*gap[j+1])) {
                        n++;
                    }
                    t[i] = start[j+1] + (n*gap[j+1]) + travel[j+1];
                } else {
                    t[i] = start[j+1] + travel[j+1];
                }
            } else {
                if(t[i] > start[j+1]+(n*gap[j+1])) {
                    while(t[i] > start[j+1]+(n*gap[j+1])) {
                        n++;
                    }
                    t[i] = start[j+1] + (n*gap[j+1]) + travel[j+1];
                } else {
                    t[i] = start[j+1] + travel[j+1];
                }
            }
        }
    }
    for(int i = 0; i < cases; i++) {
        System.out.println(t[i]);
    }
}

0 个答案:

没有答案