HDU 5920 Ugly Problem
说起这道题, 真是一把辛酸泪.
题意
将一个正整数 $n(\le 10^{1000})$ 分解成不超过50个回文数的和.
做法
构造.
队友UHC提出的一种构造方法, 写起来比较方便一些, 而且比较巧妙. 可惜我码力太弱, 现场没调出来.
大体的想法是:
将一个数"等"分成两半. 如果长度为奇数可以采取下面两种处理方法之一.
- 在开头补0.
- 后一半 (低位) 的长度向下取整.
我采取第2种处理方式.
设前一半的长度为$h_1$, 后一半的长度为 $h_2$.
然后将前一半长
(写不下去了..., 贴代码...)
Implementation
#include <bits/stdc++.h>
using namespace std;
using num=vector<int>;
using iter=num::iterator;
using riter=num::reverse_iterator;
bool Less(const num &a, const num &b){ // a and b are of same length
for(auto it1=a.rbegin(), it2=b.rbegin(); it1!=a.rend(); ++it1, ++it2)
if(*it1 != *it2){
return *it1 < *it2;
}
return false;
}
void borrow(num &a){
for(int i=a.size()/2; i<a.size(); i++)
if(a[i]){
for(--a[i]; i; a[--i]+=9); //?
break;
}
while(a.size() && *a.rbegin()==0)
a.pop_back();
}
void split(num &lo, num &hi, const num &a){
auto mid=a.begin()+a.size()/2;
lo={a.begin(), mid};
hi={mid, a.end()};
}
num operator-(num a, num b){ // a and b are of same length && a >= b
num res;
for(int i=0; i<a.size(); i++){
if(a[i]<b[i]){
a[i]+=10;
a[i+1]-=1;
}
res.push_back(a[i]-b[i]);
}
for(; res.size() && *res.rbegin()==0; )
res.pop_back();
if(res.size()){ //error-prone
for(int i=0; i<res.size()-1; i++){
res[i+1]+=res[i]/10;
res[i]%=10;
}
for(; *res.rbegin()>9; ){
int t=*res.rbegin();
*res.rbegin()%=10;
res.push_back(t/10);
}
}
for(auto x:res){
assert(x>=0 && x<10);
}
return res;
}
vector<num> res;
void out(const num &a){
for(auto it=a.rbegin(); it!=a.rend(); ++it)
cout<<*it;
cout<<endl;
}
void solve(num &a){
res.clear();
num lo, hi;
int ones=0;
while(a.size()>1){
// out(a);
split(lo, hi, a);
num rhi(hi.rbegin(), hi.rbegin()+lo.size());
if(Less(lo, rhi)){
borrow(a);
++ones;
continue;
}
a=lo-rhi;
// There is no advantage to using {} initialization, and one trap,
// when using auto to get the type determined by the initializer.
// The trap is that if the initializer is a {}-list, we may not want its
// type deduced.
//initializer_list<num> xx={rhi};
//cout<<typeid(xx).name()<<endl;
auto tmp=rhi;
//cout<<typeid(tmp).name()<<endl;
for(auto &x: hi)
tmp.push_back(x);
res.push_back(tmp);
}
if(a.size()) res.push_back(a);
assert(res.size() + ones <= 50);
printf("%d\n", res.size()+ones);
for(auto &x: res)
out(x);
while(ones--)
puts("1");
}
char s[1<<10];
int main(){
// num x, y;
// in g++:
// direct-list-intialization of 'auto' requires exactly one element
// for deduction to 'std::initializer_list', use copy-list-intialization (i.e. add '=' before the '{')
// auto xx{x, y};
int T, cas=0;
num a;
for(cin>>T; T--; ){
scanf("%s", s);
a.clear();
int n=strlen(s);
for(int i=n-1; i>=0; --i)
a.push_back(s[i]-'0');
printf("Case #%d:\n", ++cas);
solve(a);
}
return 0;
}
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)Tota ...
- HDU - 5920 Ugly Problem 求解第一个小于n的回文数
http://acm.hdu.edu.cn/showproblem.php?pid=5920 http://www.cnblogs.com/xudong-bupt/p/4015226.html 把前半 ...
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...
- D - Ugly Problem HDU - 5920
D - Ugly Problem HDU - 5920 Everyone hates ugly problems. You are given a positive integer. You must ...
- hdu-5920 Ugly Problem(贪心+高精度)
题目链接: Ugly Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 3549 Flow Problem(最大流)
HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
- Ugly Problem
Ugly Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Spec ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
随机推荐
- 安装包制作工具 SetupFactory使用1 详解
2014-11-19 Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows ...
- 解决.VS2012+EF5.0开发的网站在window server2003上无法部署的问题
(一)前 言 最近一个月使用VS2012(默认框架是.net f ...
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
- 怎样修改 Openstack Horizon(Dashboard)的显示界面 (一)
Openstack 有很多项目,比如 nova 是虚拟机管理,neutron 是虚拟网络管理, glance 是存储管理,而 horizon 是负责 Openstack 的统一界面.horizon 的 ...
- 项目规范性检测工具Lint
项目规范性检测工具lint.bat 一.Lint基本概念介绍 Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发 ...
- [C#解惑] #1 在构造函数内调用虚方法
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...
- NLPIR分词工具的使用(java环境下)
一.NLPIR是什么? NLPIR(汉语分词系统)由中科大张华平博士团队开发,主要功能包括:中文分词,词性标注,命名实体识别,用户词典功能,详情见官网:http://ictclas.nlpir.org ...
- <button>属性,居然才发现
今天学习了一个表单验证的程序,发现点了一个<botton>之后,表单里面的所有输入框的内容,统统都消失了,后来一查看源代码,我发现居然是<botton>里面的属性如下: < ...
- webpack入坑之旅(二)loader入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- 我的第一个DMZ方案实践
方案提出的初衷:外网需要定时和不定时推送数据到内网服务器(只要求数据到达内网,没有要求直接连接到内网) 为什么不是直连到内网:每个人第一想到的是不安全,是的,没错不安全.内网的应用和外网的应用最明显的 ...