【高精度 JAVA】HDU 5920 Ugly Problem

题意

给你一个数字n(n < 10^1000),将其拆成若干个回文串(不超过50个)输出拆分方案

分析

不难想到,我们可以每次给n减一个小于他的最大的回文串,这样能够尽量构造出最少数量的回文串,方法可以使直接将前一半反转贴到后一半,如果比原来的数字大,那么前一半减少1,再反转贴为后一半

比较坑的地方就是 如果构造出来的是11比n大, 那么前一半-1变成了00 ,特判一下,应该为9;如果构造出来是101比n大,应该特判为99

这个题没太多好讲的,我想在这里记录一下java编程心得,以后也会更新

主体框架

import java.io.*; // 这个没用过
import java.util.*;
import java.lang.*; //
import java.math.*;
import java.text.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
    }
}

这里的类名,在提交到oj上时,一定要取为Main,但是本机运行的时候,一定要取为和文件名相同的名字,否则会CE

输入

int n = cin.nextInt(); //读入一个整数
BigInteger n = cin.nextBigInteger(); // 读入一个大整数
double n = cin.nextDouble(); // 读入一个浮点数
String n = cin.next(); // 读入一个字符串

这里看起来是很有规律可循的……

输出

int n = 10;
System.out.print("n = "+n); //不换行
System.out.println("n = "+n);//换行

print 会输出

n = 10

println 会输出

n =

10

定义数据类型

单个变量感觉和c++ 差别不大

int 是基本数据类型 Integer 是int的包装类

基本数据类型,分为boolean、byte、int、char、long、short、double、float;

为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型

比如排序需要自定义排序规则时,只能用包装类型

定义数组为

Type [] s = new Type [55];

以及使用BigInteger 方法将字符串转为BigInteger时

BigInteger n = new BigInteger(s,10);

第一个参数为字符串,第二个参数为相应进制,对这个new,我现在不是太理解

比较大小

这里需要明白compareTo 和 == 的区别

通俗来说 == 是强相等,必须等号两边是同一个对象(可以理解成地址相同)才会返回True

而a.compareTo(b) 只要a和b数值相等就返回True

具体的比较方法,如果该数据类型有定义比较规则,就按比较规则来,比如String按字典序,按数值大小

compareTo的返回值表示比较的结果,如果 a>b 返回正数,a 和b相等 返回 0 ,a<b 返回负数

字符串String的一些操作

具体可以查阅 String.

String不等同于char[] ,它的值在创建后就不能改变

char[] 转String

char data[] = {‘a‘, ‘b‘, ‘c‘};
String str = new String(data);

取String的下标为i到j的子串

String subs = s.substring(i,j+1);

取字符串s下标为i的字符

char c  = s.charAt(i);

比较两个字符串大小

s1.compare(s2);

BigInteger的一些操作

具体可以查阅 BigInteger

四则运算

a = a.add(b); // a+=b;
a = a.subtract(b); // a-=b
a = a.multiply(b); // a*=b;
a = a.divide(b); //a/=b;
a = a.remainder(b) ; // a%=b;

位运算

a = a.and(b); // a = a&b;
a = a.or(b); // a = a|b;
a = a.xor(b) // a = a^b;
a = a.shiftLeft(n) // a = (a<<n);
a = a.shiftRight(n) // a=(a>>n)

BigDecimal的一些操作

因为我还没用过BigDecimal,直接先扔链接

BigDecimal

shell操作

这里不算是将java知识点,在shell下运行java,标准读入以及文件读入,应该还比较好理解

javac name.java // 编译
java name // 运行,标准读入,标准输出
java name <data.in //运行,文件读入,标准输出
java name >data.out // 运行,标准读入,文件输出
java name <data.int >data.out // 运行,文件读入,文件输出

STL (Collections)

java中也有类似c++STL 的存在,是一个叫做Collections的class,东西太多,不是很熟悉,先丢链接

Collections

讲一下排序方法

  • 以自然顺序(从小到大)排序

    nt[] a = new int[15];
    int n = cin.nextInt();
    for(int i = 1;i<=n;i++) a[i] = cin.nextInt();
    Arrays.sort(a,1,n+1); 
  • 自定义顺序(从大到小)顺序
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.math.*;
    import java.text.*;
    public class test
    {
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        Integer[] a = new Integer[15];
        int n = cin.nextInt();
        for(int i = 1;i<=n;i++) a[i] = cin.nextInt();
        Comparator <Integer> c = new Mycomparator();   // 实例化一个Comparator对象
        Arrays.sort(a,1,n+1,c);
        for(int i = 1;i<=n;i++) System.out.print(a[i]+" ");
        System.out.println();
    }
    }
    class Mycomparator implements Comparator <Integer>
    {
        public int compare(Integer x, Integer y)
        {  
    
            if(x > y) return -1;
            if(x < y) return 1;
            return 0;
        }
    }

AC代码

import java.util.Scanner;
import java.math.*;
import java.text.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        int T = cin.nextInt();
        String [] s = new String [55];
        for(int Case=1;Case<=T;Case++)
        {
            BigInteger n = cin.nextBigInteger();
            int ans = 0;
            while(ans < 50 && n.compareTo(BigInteger.valueOf(0))>0 )
            {
                String t = n.toString();
                int lenth = t.length();
                if(lenth == 1){
                    ans+=1;s[ans] = t;
                    break;
                }
                    String t1 = "";
                    String t2 = "";
                    int mid = lenth/2-1;
                    for(int i = 0;i<=mid;i++)
                        t2 += t.charAt(i);
                    t1 = t2;
                    if(lenth %2!=0) t1 += t.charAt(lenth/2);
                    for(int i = mid;i>=0;i--)
                        t1+=t2.charAt(i);
                    BigInteger m = new BigInteger(t1,10);
                    if(n.compareTo(m)<0)
                    {
                        if(t1.compareTo("11") == 0) t1 = "9";
                        else if(t1.compareTo("101") == 0) t1 = "99";
                        else{
                            m = new BigInteger(t2,10);
                            m = m.subtract(BigInteger.ONE);
                            if(m.compareTo(BigInteger.ZERO) == 0){
                                t1 = "";
                                t1 += t.charAt(lenth/2);
                            }
                            else{
                                t2 = "";
                                t2+=m.toString();
                                mid = t2.length()-1;
                                t1 = t2;
                                if(lenth%2 != 0)
                                t1 += t.charAt(lenth/2);
                                for(int i = mid;i>=0;i--)   t1+=t2.charAt(i);
                            }
                        }
                    }
                //
                ans+=1;
                s[ans] = t1;
                m = new BigInteger(t1,10);
                n = n.subtract(m);
            }
            System.out.println("Case #"+Case+":");
                    System.out.println(ans);
                    for(int i = 1;i<=ans;i++) System.out.println(s[i]);
        }
    }
}

原文地址:https://www.cnblogs.com/greenty1208/p/9127498.html

时间: 2024-10-09 04:55:26

【高精度 JAVA】HDU 5920 Ugly Problem的相关文章

HDU 5920 Ugly Problem 【模拟】 (2016中国大学生程序设计竞赛(长春))

Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0Special Judge Problem Description Everyone hates ugly problems. You are given a positive integer. You m

HDU - 5920 Ugly Problem 求解第一个小于n的回文数

http://acm.hdu.edu.cn/showproblem.php?pid=5920 http://www.cnblogs.com/xudong-bupt/p/4015226.html 把前半部分复制过去,如果太大,那么早到第一个会使得其太大的点,减1,然后对应的中间的变成9 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <a

D - Ugly Problem HDU - 5920

D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must represent that number by sum of palindromic numbers. A palindromic number is a positive integer such that if you write out that integer as a string i

JAVA HDU 1048 The Hardest Problem Ever

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1048 1 package hdu; 2 3 import java.io.BufferedInputStream; 4 import java.util.Scanner; 5 6 public class hdu_1048 { 7 8 public static void main(String[] args) { 9 Scanner in = new Scanner(new BufferedInp

Ugly Problem

Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Special Judge Problem Description Everyone hates ugly problems. You are given a positive integer. You must represent that number by sum of palindromic num

hdu-5920 Ugly Problem(贪心)

题目链接: Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 363    Accepted Submission(s): 134Special Judge Problem Description Everyone hates ugly problems. You are given a positive inte

HDU 3549 Flow Problem 网络最大流问题 Edmonds_Karp算法

题目链接:HDU 3549 Flow Problem Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8218    Accepted Submission(s): 3824 Problem Description Network flow is a well-known difficult problem f

JAVA hdu 4882 ZCC Loves Codefires

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4882 题解:参考题后Discuss javaherongwei 的讲解 考察序列中相邻的两题i, j(i在前).交换它们后,解出它们之前的题目所带来的时间对答案的贡献是不变的,它们对它们后面的题目的贡献也是不变的,其他题目之间对答案的贡献自然也是不变的.唯一的变化就是,原来的EiKj一项变成了EjKi一项.那么,为了使答案变优,需要满足的条件是EjKi≤EiKj.也即Ei/Ki≥Ej/Kj.那么,最

hdu 3549 Flow Problem (网络最大流)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 6674    Accepted Submission(s): 3112 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, yo