题目链接:

Ugly Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 363    Accepted Submission(s): 134
Special Judge

Problem Description
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 in decimal without leading zeros, the string is an palindrome. For example, 1 is a palindromic number and 10 is not.

 
Input
In the first line of input, there is an integer T denoting the number of test cases.

For each test case, there is only one line describing the given integer s (1≤s≤101000).

 
Output
For each test case, output “Case #x:” on the first line where x is the number of that test case starting from 1. Then output the number of palindromic numbers you used, n, on one line. n must be no more than 50. en output n lines, each containing one of your palindromic numbers. Their sum must be exactly s.
 
Sample Input
2
18
1000000000000
 
Sample Output
Case #1:
2
9
9
Case #2:
2
999999999999
1
 
 
题意:
 
给一个大数,然后让你找到不超过50个回文数的和为这个数;
 
思路:
 
每次找前边取一半减一,然后再复制另一半,这样很快就好了,手写了了一个大数减法,写成了智障了都;
 
AC代码:
 
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss)); typedef long long LL;
typedef unsigned long long ULL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
} const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=1e9;
const int N=1e4+120;
const int maxn=1e3+220;
const double eps=1e-12; int n,k,cnt;
char s[maxn];
int a[maxn]; struct Big
{
int a[maxn],leng;
}ans[maxn],temp;
Big fun(Big A,Big B)
{
Big C;
mst(C.a,0);
for(int i=A.leng;i<maxn;i++)A.a[i]=0;
for(int i=B.leng;i<maxn;i++)B.a[i]=0;
int hi=max(A.leng,B.leng),lc=0;
for(int i=0;i<hi;i++)
{
if(A.a[i]<B.a[i])
{
A.a[i+1]--;
A.a[i]+=10;
C.a[i]=A.a[i]-B.a[i];
}
else C.a[i]=A.a[i]-B.a[i];
}
for(int i=0;i<=hi;i++)
{
if(C.a[i]<0)
{
C.a[i+1]--;
C.a[i]+=10;
}
}
int flag=1;
for(int i=hi+1;i>=0;i--)
{
if(C.a[i]>0){lc=i;flag=1;break;}
}
if(flag)C.leng=lc+1;
else C.leng=0;
return C;
} Big newBig(Big A)
{
int lenth=A.leng;
Big B,C,D,E;
mst(B.a,0);B.leng=0;
mst(C.a,0);C.leng=0;
mst(D.a,0);D.leng=0;
mst(E.a,0);E.leng=0;
B.leng=lenth;
if(lenth%2==1)
{
int mid=lenth/2;
for(int i=lenth-1;i>=mid;i--)B.a[i]=A.a[i];
for(int i=mid-1;i>=0;i--)B.a[i]=D.a[i]=0;
D.a[mid]=1;
D.leng=mid+1;
E=fun(B,D);
if(E.leng==A.leng-1)
{
C.leng=E.leng;
for(int i=0;i<C.leng;i++)C.a[i]=9;
}
else
{
C.leng=A.leng;
for(int i=C.leng-1;i>=mid;i--)C.a[i]=E.a[i];
for(int i=mid-1;i>=0;i--)C.a[i]=E.a[2*mid-i];
}
}
else
{
int mid=lenth/2;
for(int i=lenth-1;i>=mid;i--)B.a[i]=A.a[i];
for(int i=mid-1;i>=0;i--)B.a[i]=D.a[i]=0;
D.a[mid]=1;D.leng=mid+1;
E=fun(B,D);
if(E.leng!=lenth)
{
C.leng=E.leng;
for(int i=C.leng-1;i>=0;i--)C.a[i]=9;
}
else
{
C.leng=lenth;
for(int i=C.leng-1;i>=mid;i--)C.a[i]=E.a[i];
for(int i=mid-1;i>=0;i--)C.a[i]=E.a[2*mid-i-1];
}
}
return C;
}
void solve()
{
int lenth=temp.leng;
Big A;
while(lenth)
{
if(lenth==2&&temp.a[1]==1)
{
A.leng=1;
A.a[0]=9;
}
else if(lenth==1)
{
if(temp.a[0]==0)break;
A.leng=1;
A.a[0]=temp.a[0];
ans[++cnt]=A;
break;
}
else A=newBig(temp);
ans[++cnt]=A;
temp=fun(temp,A);
lenth=temp.leng;
}
}
int main()
{
int t,Case=0;
read(t);
while(t--)
{
printf("Case #%d:\n",++Case);
scanf("%s",s);
int len=strlen(s),num=0;
cnt=0;
for(int i=len-1;i>=0;i--)temp.a[num++]=s[i]-'0';
temp.leng=len;
solve();
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
for(int j=ans[i].leng-1;j>=0;j--)printf("%d",ans[i].a[j]);
printf("\n");
}
}
return 0;
}

  

hdu-5920 Ugly Problem(贪心+高精度)的更多相关文章

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

    Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛

    题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=5920 http://www.cnblogs.com/xudong-bupt/p/4015226.html 把前半 ...

  4. HDU 5920 Ugly Problem

    说起这道题, 真是一把辛酸泪. 题意 将一个正整数 \(n(\le 10^{1000})\) 分解成不超过50个回文数的和. 做法 构造. 队友UHC提出的一种构造方法, 写起来比较方便一些, 而且比 ...

  5. D - Ugly Problem HDU - 5920

    D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must ...

  6. HDU 4442 Physical Examination(贪心)

    HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...

  7. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  8. hdu 5106 Bits Problem(数位dp)

    题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...

  9. Ugly Problem

    Ugly Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Spec ...

随机推荐

  1. Linux里如何查找文件内容

    Linux查找文件内容的常用命令方法. 从文件内容查找匹配指定字符串的行: $ grep "被查找的字符串" 文件名例子:在当前目录里第一级文件夹中寻找包含指定字符串的.in文件g ...

  2. www.97top10.com--做最好的技术交流网站

    www.97top10.com--做最好的技术交流网站

  3. Win10安装framework3.5

    .NET少不了framewrok,其版本也比较多,默认情况下win7及上版本没有安装framework3.5,但有些软件又需要它,比如arcgis软件在安装时会检测是否存在3.5,如果没有,将不会正常 ...

  4. Atitit.病毒木马程序的感染 传播扩散 原理

    Atitit.病毒木马程序的感染 传播扩散 原理 1. 从木马的发展史考虑,木马可以分为四代 1 2. 木马有两大类,远程控制  vs  自我复制传播1 3. 自我复制2 3.1. 需要知道当前cpu ...

  5. Android项目实战(二):安卓应用程序退出的三种方法

    现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: ...

  6. Android学习一(入门)

    一.Android 系统简介 1.1.1G-4G 1G:模拟制式手机,1995年问世的第一代模拟制式手机,只能进行语音通话, 2G:手机使用GSM,CDMA(9K/s),增加了接收数据的功能 2.5G ...

  7. IOS NSThread

    任何一个 iOS 应用程序都是由一个或者多个线程构成的.无论你是否使用了多线程编程技术,至少有 1 个 线程被创建.多线程就是为了提高引用程序的工作效率!避免阻塞主线程!当我们没有用任何多线程技术的话 ...

  8. iOS之 随笔-静态库创建Xcode7

    不多说直接上图 然后你就可以找到你的.a文件了还有你的头文件 在终端可以检查你所编译的静态库都支持什么架构(armv7,armv7s ,arm64)用这个命令 lipo -info 编译时候要看你Xc ...

  9. java网络---查找Internet

    连接到Internet的设备称为节点,计算机节点称为host. 为了区别每一台连接互联网的计算机,就有了Internet Protocol地址的概念. IPV4 & IPV6 我们以前默认的是 ...

  10. QA:java.lang.RuntimeException:java.io.FileNotFoundException:Resource nexus-maven-repository-index.properties does not exist.

    QA:java.lang.RuntimeException:java.io.FileNotFoundException:Resource nexus-maven-repository-index.pr ...