1005. 继续(3n+1)猜想

来源:互联网 发布:windows cp命令参数 编辑:程序博客网 时间:2024/06/03 07:21

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(<100),第2行给出K个互不相同的待验证的正整数n(1<n<=100)的值,数字间用空格隔开。

输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。

输入样例:
63 5 6 7 8 11
输出样例:
7 6

import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {  public static void main(String[] args) {    Scanner scanner = new Scanner(System.in);    int n = Integer.parseInt(scanner.nextLine());    String[] arr = scanner.nextLine().split(" ");    int[] nums = new int[n];    List<Integer> coveredNumList = new ArrayList<Integer>();    for(int i=0; i<n; i++){      nums[i] = Integer.parseInt(arr[i]);      if(coveredNumList.contains(nums[i])){        continue;      }      getCallatz(nums[i], coveredNumList);    }    List<Integer> keyNumList = new ArrayList<Integer>();    for(int i=0; i<n; i++){      if(!coveredNumList.contains(nums[i])){        addKeyNum(nums[i], keyNumList);      }    }    if(keyNumList == null || keyNumList.isEmpty()){      return;    }    StringBuilder builder = new StringBuilder();    for(int i=0; i<keyNumList.size(); i++){      builder.append(" ").append(keyNumList.get(i));    }    System.out.println(builder.substring(1));  }  private static void addKeyNum(int num, List<Integer> keyNumList) {    if(keyNumList.isEmpty()){      keyNumList.add(num);    } else {      int index = 0;      for(int i=0; i<keyNumList.size(); i++){        if(keyNumList.get(i) < num){          index = i;          break;        }      }      keyNumList.add(index, num);    }  }  private static void getCallatz(int num, List<Integer> coveredNumList) {    while(num > 1){      num = num % 2 == 0 ? num >> 1 : (num * 3 + 1) >> 1;      if(!coveredNumList.contains(num)){        coveredNumList.add(num);      }    }  }}

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户4月30日 08:56部分正确201005Java (javac 1.6.0)9311212zspring

测试点

测试点结果用时(ms)内存(kB)得分/满分0答案正确791040815/151答案错误79104400/22答案正确80103842/23答案错误80103080/34答案正确93112123/3

0 0
原创粉丝点击