题目链接:

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. [PHP] 实现路由映射到指定控制器

    自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本 SimpleLoader.php <?php class SimpleLoader{ public static func ...

  2. CentOS6.5 FTP配置

    一:安装vsftpd 查看是否已经安装vsftpd rpm -qa | grep vsftpd 如果没有,就安装,并设置开机启动 yum -y install vsftpd chkconfig vsf ...

  3. JVM的ClassLoader过程分析

    本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...

  4. springmvc+mybatis+spring 整合

    获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] ...

  5. 自己写方法处理WP(RT)后退键事件处理

    不用微软的NavigationHelper,自己写方法处理WP后退键事件 在WP8.1(RT)程序中,你会发现按下后退键时,应用会直接退出,变为后台运行,这是因为RT与Silverlight对后退键的 ...

  6. ASP.NET MVC another entity of the same type already has the same primary key value

    ASP.NET MVC项目 Repository层中,Update.Delete总是失败 another entity of the same type already has the same pr ...

  7. ArcGIS使用Python脚本工具

    在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...

  8. SharePoint 2013 跨网站集发布功能简介

    在SharePoint Server 2013网站实施中,我们经常会遇到跨网站集获取数据,而2013的这一跨网站集发布功能,正好满足我们这样的需求. 使用SharePoint 2013中的跨网站发布, ...

  9. Android-adb 常用命令 和 sqlite

    Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...

  10. 嵌入式调试器原理和各类调试器集锦(JLINK、STLINK、CCDEBUG)

    工欲善其事,必先善其器.调试器在嵌入式开发调试中的重要性不言而喻,单步.断点和监察的效率远高于串口打印.但是,调试器对于一般开发人员往往是一个黑匣子.今天我们就来谈谈调试器的原理,顺便把自己的几类调试 ...