简单的程序,但不能正确

时间:2016-11-29 15:20:19

标签: java algorithm

问题

  

海龟长寿(并且繁荣)。桑给巴尔岛上的海龟是   甚至不朽。此外,他们是无性的,每年他们都给予   最多生一个孩子。除此之外,他们什么都不做。他们   永远不要离开他们的热带天堂。

     Zanzibar上的第一只乌龟Zanzi Bar还有一项活动:它   跟踪岛上的海龟数量。每个新年   它计算海龟的数量,并将总数写成一小部分   小册子。多年以后,这本小册子包含了不减少的内容   整数序列,从一个或多个开始。 (出现之后   从桑给巴尔美丽的海滩上的鸡蛋开始,Zanzi花了一些时间   独自创办一个家庭。)

     

有一天,Zanzi意识到海龟的情况也可能如此   从国外来到桑给巴尔,乘船或飞机。现在它想知道如何   许多居民并非出生在桑给巴尔。不幸的是,它   只能从小册子中的序列中导出下限。   事实上,如果一年中海龟的数量超过两倍   与前一年相比,必须通过导入来充分解释差异。

     

桑给巴尔有100万只乌龟,岛上完全覆盖   与乌龟一起,繁殖和进口都停止了。请   帮助Zanzi!编写一个计算导入下限的程序   如上所述,给定序列的海龟。

     

输入

     

输入以包含整数T(1≤T≤13)的行开始   测试用例数量。然后针对每个测试用例:

     

一行包含一系列以空格分隔的正整数   (≤1000000),非减少,从一个或多个开始。对于   方便,单个空格和0附加到末尾   序列

     

输出

     

对于每个测试用例,输出一个包含单个整数的行:   未在桑给巴尔出生的海龟数量的下限。

See question and sample input and output here

我的方法

    public Zanzibar() {

    Scanner scan = new Scanner(System.in);
    int iterations = scan.nextInt();

    for (int i = 0; i < iterations; i++) {

        int previous = -1;
        int current = -1;
        int lower = 0;

        while (true) {

            if (current != -1)
                previous = current;

            current = scan.nextInt();

            if (current == 0)
                break;

            if (current > 2 * previous && previous != -1)
                lower += current - previous;
        }
        System.out.println(lower);
    }
}

我认为我理解错误的问题。我应该继续增加下限还是应该找到两年之间的最大差异?另外,我不理解输入1 100 0如何产生输出98(来自链接)。难道不是99?

1 个答案:

答案 0 :(得分:2)

问题制定者希望我们理解这一点:

每个测试用例的初始1表示岛上的初始人口总是1

因此对于像1 1 1 0这样的输入,它意味着:

初始人口为1。然后在第二年开始时,人口仍为1。在第3年开始时,人口仍为1

至于您对输入的疑问:1 28 0,这意味着:

在第二年开始时,人口为28,而本来可以达到的最大值是2,因为唯一的龟可以生出最多一只乌龟。所以,这意味着,至少(28-2) = 26龟迁移!!!

希望它有所帮助...

编辑:这是算法:

对于每一行测试用例,请执行以下操作:

  • initial设为1,将migrated设为0
  • 开始阅读该行中的第二个数字,直到遇到0

    1. 如果current号码大于2*initialmigrated = migrated + (current - 2*initial)
    2. 其他:什么都不做
    3. initial设为current
  • 打印migrated

修改-2:

这是JAVA实现:

import java.util.*;
class Main {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int iterations = scan.nextInt();
    int i = 0;
    int len,x;
    int j,initial;
    long migrated;
    int arr[] = new int[1000005];
    while(i<iterations)
    {
      len = 0;
      while(true)
      {
        x = scan.nextInt();
        if(x==0)
          break;
        arr[len++] = x;
      }
      initial = arr[0];
      migrated = 0;
      j = 1;
      while(j<len)
      {
        if(arr[j]-(2*initial)>0)
        {
          migrated += arr[j]-(2*initial);
        }
        initial = arr[j];
        j++;
      }
      System.out.println(migrated);
      i++;
    }
  }
}

<强>输入:

3
1 100 0
1 1 1 2 2 4 8 8 9 0
1 28 72 0

<强>输出:

98
0
42