zoukankan      html  css  js  c++  java
  • ZOJ3477&JAVA大数类

    转:http://blog.csdn.net/sunkun2013/article/details/11822927

     1 import java.util.*;
     2 import java.math.BigInteger;
     3 import java.util.Collections;
     4 import java.util.PriorityQueue;
     5 import java.util.Scanner;
     6 public class Switch {
     7 public static void main(String[] args) {
     8         // TODO Auto-generated method stub
     9 
    10         BigInteger a = new BigInteger("997945672345647898769");
    11         BigInteger b = new BigInteger("59164562345721340329");
    12 
    13             System.out.println("两大数运算结果为:");
    14         
    15         BigInteger c = a.add(b);
    16         BigInteger d = a.subtract(b);
    17         BigInteger e = a.multiply(b);
    18         BigInteger f = a.divide(b); // 若除数为0,程序会自动抛出异常
    19         BigInteger g = a.remainder(b);
    20         
    21             System.out.println(a + " + " + b + " = " + c);    
    22                 System.out.println(a + " - " + b + " = " + d);
    23             System.out.println(a + " * " + b + " = " + e);
    24         System.out.println(a + " / " + b + " = " + f);
    25         System.out.println(a + " % " + b + " = " + g);
    26     }
    27 }
    Doraemon's Number Game

    Time Limit: 2 Seconds      Memory Limit: 65536 KB

    Doraemon and Nobita are playing a number game. First, Doraemon will give Nobita N positive numbers. Then Nobita can deal with these numbers for two rounds. Every time Nobita can delete i (2 ≤ i ≤ K) numbers from the number set. Assume that the numbers deleted is a[ 1 ], a[ 2 ] ... a[ i ]. There should be a new number X= ( a[ 1 ] * a[ 2 ] * ... * a[ i ] + 1 ) to be inserted back into the number set. The operation will be applied to the number set over and over until there remains only one number in the set. The number is the result of round. Assume two results A and B are produced after two rounds. Nobita can get |A - B| scores.

    Now Nobita wants to get the highest score. Please help him.

    Input

    Input will contain no more than 10 cases. The first line of each case contains two positive integers N and K (1 ≤ N ≤ 100, 1 ≤ K ≤ 50). The following line contains Npositive integers no larger than 50, indicating the numbers given by Doraemon.

    Output

    For each case, you should output highest score in one line.

    Sample Input

    6 3
    1 3 4 10 7 15
    

    Sample Output

    5563
    

    Hint

    For most cases, N ≤ 20

    题意:在一个正数集合中,可以删去任意i(2<=i<=k)个数,加上这i个数的乘积+1的数,最后只剩下一个数。因为有多种情况每种情况对应一个数,问:在这些只剩下一个数的数中选取两个数绝对值之差最大(|A-B|)的即是答案。

    思路:猜想到:在数集中每次删去最小的两个数加上一个数,这样最后剩下的一个数是最大的;同样的,在数集中每次删去最多个(即K)数再加上一个数,这样最后剩下的一个数是最小的。

    难点:由于这里可能达到50个数相乘,所以考虑到用JAVA大数类。

     1 import java.util.*;
     2 import java.math.BigInteger;
     3 import java.util.Collections;
     4 import java.util.PriorityQueue;
     5 import java.util.Scanner;
     6 public class Main {
     7  //int i;
     8     public static void main(String[] args) {
     9       Scanner in=new Scanner(System.in);
    10     while(in.hasNext())
    11     {
    12         int n=in.nextInt();
    13         int k=in.nextInt();
    14         if(n==1)
    15         {
    16             int e=in.nextInt();
    17             System.out.println("0");
    18             continue;
    19         }
    20         BigInteger a,b,one,temp;
    21         PriorityQueue<BigInteger> minq=new PriorityQueue<BigInteger>();
    22         PriorityQueue<BigInteger> maxq=new PriorityQueue<BigInteger>(1000,Collections.reverseOrder());
    23         for(int i=0;i<n;i++)
    24         {
    25             a=in.nextBigInteger();
    26             minq.add(a);
    27             maxq.add(a);
    28         }
    29          one=BigInteger.ONE;
    30         while(minq.size()>1)
    31         {
    32             a=minq.peek();
    33             minq.remove(a);
    34             b=minq.peek();
    35             minq.remove(b);
    36             a=a.multiply(b);
    37             a=a.add(BigInteger.ONE);
    38             minq.add(a);
    39         }
    40         one=minq.peek();
    41         
    42         while(maxq.size()>k)
    43         {
    44             temp=BigInteger.ONE;
    45             for(int i=0;i<k;i++)
    46             {
    47                 a=maxq.peek();
    48                 maxq.remove(a);
    49                 temp=temp.multiply(a);
    50             }
    51             temp=temp.add(BigInteger.ONE);
    52             maxq.add(temp);
    53         }
    54         temp=BigInteger.ONE;
    55         while(!maxq.isEmpty())
    56         {
    57             a=maxq.peek();
    58             maxq.remove(a);
    59             temp=temp.multiply(a);
    60         }
    61         temp=temp.add(BigInteger.ONE);
    62         //System.out.println(temp);
    63         //System.out.println(one);
    64         //System.out.println(temp);
    65         System.out.println(one.subtract(temp));
    66 }
    67 }
    68    
    69 }
  • 相关阅读:
    java设计模式9.备忘录模式、访问者模式、调停者模式
    java设计模式8.迭代子模式、责任链模式、命令模式
    java设计模式7.策略模式、模板方法模式、观察者模式
    java设计模式5.组合模式、门面模式、享元模式、桥接模式
    java设计模式4.适配器模式、装饰器模式
    第6章 事务管理 6.1 spring事务
    第8章 浏览器对象模型BOM 8.1 window对象
    关于Socket、TCP/IP、HTTP、FTP及网络编程
    GO.Web服务
    git clone 下载慢
  • 原文地址:https://www.cnblogs.com/ZP-Better/p/4685056.html
Copyright © 2011-2022 走看看