题目描述:

time limit per test

2 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Dima worked all day and wrote down on a long paper strip his favorite number n

consisting of l digits. Unfortunately, the strip turned out to be so long that it didn't fit in the Dima's bookshelf. To solve the issue, Dima decided to split the strip into two non-empty parts so that each of them contains a positive integer without leading zeros. After that he will compute the sum of the two integers and write it down on a new strip. Dima wants the resulting integer to be as small as possible, because it increases the chances that the sum will fit it in the bookshelf. Help Dima decide what is the minimum sum he can obtain.

Input

The first line contains a single integer l(2≤l≤100000) — the length of the Dima's favorite number.

The second line contains the positive integer n initially written on the strip: the Dima's favorite number.

The integer n consists of exactly l digits and it does not contain leading zeros. Dima guarantees, that there is at least one valid way to split the strip.

Output

Print a single integer — the smallest number Dima can obtain.

Examples

Input

7
1234567

Output

1801

Input

3
101

Output

11

Note

In the first example Dima can split the number 1234567

into integers 1234 and 567. Their sum is 1801.

In the second example Dima can split the number 101 into integers 10 and 1. Their sum is 11.

Note that it is impossible to split the strip into "1" and "01" since the numbers can't start with zeros.

思路:

题目是要把一个大数拆成两个小数,并且让他们加起来的和最小。

根据贪心的思想,可以想到,如果把数从中间分开,从而让两个数的位数差不多时,两者的和应该是比较小的。但是题目中有要求,拆成的两个数不能有前导零。咋办。

就把所有不是零 的元素的索引提出来加到一个vector里面,因为要取尽量中间的数,就用一下lower_bound二分找原数组长度一半的位置mid,能找到vector里接近mid的元素。

然后用这个元素所表示的索引,在原来的数组中索引附近遍历,取到不同的分割位置,选出分割后的和最小者。

但是数好像很大哎,只有用字符串来模拟了,传说中的大数加法。

代码:

 #include <iostream>
#include <string>
#include <vector>
using namespace std;
int n;//接收数字位数
string s;//接收数字
vector<int> vec;//来存值不为零的元素的索引
string rm0(string a)//删除前导零
{
int i;
for(i = ;i<a.size();i++)
{
if(a[i]!='')
{
break;
}
}
a = a.substr(i);
return a;
}
string add(string a,string b)//大数加法
{
if(a.size()<b.size()) //先把两者位数补成一样的
{
swap(a,b);
}
a = ''+a;
while(b.size()<a.size())
{
b = ''+b;
}
int c = ;
for(int i = b.size()-;i>=;i--) //从低位到高位加
{
int sum = c+(int)a[i]-''+(int)b[i]-'';
if(sum>=)
{
a[i] = (char)sum-+'';
c = ;
}
else
{
a[i] = (char)sum+'';
c = ;
}
}
a = rm0(a);
return a;
}
int larger(string a,string b)//判断a是不是大于等于b
{
if(a.size()!=b.size())
{
return a.size()>b.size();
}
else
{
for(int i = ;i<a.size();i++)
{
if(a[i]!=b[i])
{
return a[i]>b[i];
}
}
}
return ;
}
int main()
{
cin >> n >> s;
string a = "";
string b = "";
for(int i = ;i<n;i++)
{
if(s[i]!='')
{
vec.push_back(i);
}
}
int mid = lower_bound(vec.begin(),vec.end(),n/)-vec.begin();//找不为零的接近中间位置的数在原数组的索引
string ans = s;
for(int i = -;i<;i++)//在索引附近遍历一遍
{
int pos = max(,min((int)vec.size()-,mid+i));
a = s.substr(,vec[pos]);
b = s.substr(vec[pos]);
string res = add(a,b);
if(larger(ans,res))
{
ans = res;//取最小值
}
}
cout << ans << endl;
return ;
}

参考文章:

我写的可能不清楚,如果还有问题,参见推荐博客:

茄子Min,Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心),https://www.cnblogs.com/qieqiemin/p/11033007.html

另外本题涉及到一些实用的字符串处理函数,具体可见:

GGBeng,C++中substr函数的用法,https://www.cnblogs.com/xzxl/p/7243490.html

Codeforces C. Split a Number(贪心大数运算)的更多相关文章

  1. Codeforces - 1181B - Split a Number - 贪心

    https://codeforces.com/contest/1181/problem/B 从中间拆开然后用大数搞一波. 当时没想清楚奇偶是怎么弄,其实都可以,奇数长度字符串的中心就在len/2,偶数 ...

  2. PAT甲题题解-1024. Palindromic Number (25)-大数运算

    大数据加法给一个数num和最大迭代数k每次num=num+num的倒序,判断此时的num是否是回文数字,是则输出此时的数字和迭代次数如果k次结束还没找到回文数字,输出此时的数字和k 如果num一开始是 ...

  3. Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)

    B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...

  4. Codeforces Round #567 (Div. 2) B. Split a Number

    Split a Number time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...

  5. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

  6. [PKU2389]Bull Math (大数运算)

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  7. HOJ 2148&POJ 2680(DP递推,加大数运算)

    Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...

  8. 大数运算(python2)

    偶然又遇到了一道大数题,据说python大数运算好屌,试了一发,果然方便-1 a = int( raw_input() ); //注意这里是按行读入的,即每行只读一个数 b = int( raw_in ...

  9. java 大数运算[转]

    用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...

随机推荐

  1. 配置SSH无密码登录【原著】

    环境:两台Centos虚拟机,配置了静态的ip.(详见虚拟机如何配置静态的IP地址的操作步骤) 192.168.75.21192.168.75.22 第一步:为每台服务器配置静态IP地址参见: 虚拟机 ...

  2. Oracle Spatial分区应用研究之四:不同分区粒度+全局空间索引效率对比

    1.实验目的 在实验之前先回答这样一个问题——对同一份数据使用不同的分区粒度,但均创建全局空间索引,问:它们的全局空间索引一致吗? 怎样算是一致的呢?R-TREE的树结构一致算一致吗?空间索引条目数及 ...

  3. C# 拷贝文件夹到指定文件夹并更改文件夹名称

    using System; using System.Collections.Generic; using System.Text; namespace ClientPrintServer.Tools ...

  4. 在linux上安装redis

    下载Redis安装包 wget  http://download.redis.io/releases/redis-3.2.9.tar.gz 解压Redis安装包 tar -zxvf redis-3.2 ...

  5. 031 SSM综合练习07--数据后台管理系统--用户详情查询

    1.用户详情查询流程分析 2.代码实现 (1)user-list.jsp页面部分代码 点击jsp页面中的详情按钮,发送请求到UserController.java <!--数据列表--> ...

  6. windows 系统防火墙 添加端口号方法

    目前在大部分公司内使用的台式机和部分服务器都采用了Windows操作系统,而我么都知道相当一部分病毒.恶意程序.黑客都是利用扫描端口号,利用开放的端口进行入侵,此时大型企业都会将服务器的系统防火墙打开 ...

  7. java之spring mvc之拦截器

    1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2. 自定义实现一个拦截器的步骤: a). ...

  8. np.newaxis的使用及有趣的数组相乘

    a=np.array([1,2,3,4])a=a[np.newaxis,:] #固定行,相当于1行多列b=np.array([2,4,6]) b=b[:,np.newaxis] #固定列,相当与多行1 ...

  9. 2019 欢聚时代java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.欢聚时代等公司offer,岗位是Java后端开发,因为发展原因最终选择去了 欢聚时代,入职一年时间了,也成为了 ...

  10. Selenium浏览器自动化测试工具

    目录 Selenium浏览器自动化测试工具 Selenium模块在爬虫中的使用 Python简单使用Selenium Selenium的基本操作 Selenium爬取动态加载的数据 Selenium动 ...