题意:
给一个长度
思路:
首先,该长度的数无法用整数保存,考虑用字符串来运算。
其次,考虑朴素做法,枚举分界点,每次取最小值。由于高精度加法是O ( n )的,枚举一遍计算的复杂度是O ( n 2 ),会超时。
贪心的考虑,尽可能的使得两个数的长度接近。
1.如果长度为奇数时,选择中位数
2.长度为偶数时,选择中间位置的两个数。
由于题目要求不能有前导0,所以也要判断一下0的问题。
代码:
// Problem: B. Split a Number // Contest: Codeforces - Codeforces Round #567 (Div. 2) // URL: https://codeforces.com/contest/1181/problem/B // Memory Limit: 512 MB // Time Limit: 2000 ms // Author:Cutele // // Powered by CP Editor (https://cpeditor.org) #pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll>PLL; typedef pair<int, int>PII; typedef pair<double, double>PDD; #define I_int ll inline ll read() { ll x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-')f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } inline void out(ll x){ if (x < 0) x = ~x + 1, putchar('-'); if (x > 9) out(x / 10); putchar(x % 10 + '0'); } inline void write(ll x){ if (x < 0) x = ~x + 1, putchar('-'); if (x > 9) write(x / 10); putchar(x % 10 + '0'); puts(""); } #define read read() #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define multiCase int T;cin>>T;for(int t=1;t<=T;t++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i<(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define perr(i,a,b) for(int i=(a);i>(b);i--) ll ksm(ll a, ll b) { ll res = 1; while(b) { if(b & 1)res = res * a ; a = a * a ; b >>= 1; } return res; } string add(string a,string b)//只限两个非负整数相加 { const int L=1e5; string ans; int na[L]={0},nb[L]={0}; int la=a.size(),lb=b.size(); for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0'; for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0'; int lmax=la>lb?la:lb; for(int i=0;i<lmax;i++) na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10; if(na[lmax]) lmax++; for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0'; return ans; } string get_min(string res,string t){ if(res=="0") return t; if(res.size()>t.size()) res=t; else if(res.size()==t.size()) res=min(res,t); return res; } int n;string s; string cul(int pos){ string s1=s.substr(0,pos); string s2=s.substr(pos,n-pos); return add(s1,s2); } string cul2(int pos){ string res="0"; for(int i=pos-1;i>=1;i--){ if(s[i]!='0'){ res=cul(i);break; } } for(int i=pos+1;i<n;i++){ if(s[i]!='0'){ res=get_min(res,cul(i));break; } } return res; } int main(){ n=read; cin>>s; string res; bool flag=0; if(n%2){ int pos1=n/2,pos2=n/2+1,cnt=0; if(s[pos1]!='0') res=cul(pos1); else res=cul2(pos1); if(s[pos2]!='0') res=get_min(res,cul(pos2)); else res=get_min(res,cul2(pos2)); } else{ int pos=n/2; if(s[pos]!='0') res=cul(pos); else res=cul2(pos); } cout<<res<<endl; return 0; }