CF1181B.Split a Number(贪心+高精度)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: CF1181B.Split a Number(贪心+高精度)

传送门

题意:

给一个长度

思路:

首先,该长度的数无法用整数保存,考虑用字符串来运算。

其次,考虑朴素做法,枚举分界点,每次取最小值。由于高精度加法是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;
}


目录
相关文章
|
机器学习/深度学习 人工智能 算法
CF1550A Find The Array(贪心算法)
CF1550A Find The Array(贪心算法)
36 0
|
机器学习/深度学习 人工智能
CF1496A Split it!(数学分析)
CF1496A Split it!(数学分析)
44 0
|
数据库管理
CF1547B Alphabetical Strings(了解字符串的的一些规律)
CF1547B Alphabetical Strings(了解字符串的的一些规律)
77 0
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
LeetCode Contest 178-1368. 使网格图至少有一条有效路径的最小代价 Minimum Cost to Make at Least One Valid Path in a Grid
|
机器学习/深度学习 vr&ar
CF1561D Up the Strip (整除分块 dp 因子)
CF1561D Up the Strip (整除分块 dp 因子)
109 0
CF1561D Up the Strip (整除分块 dp 因子)
|
人工智能 算法
LeetCode 1347. 制造字母异位词的最小步骤数 Minimum Number of Steps to Make Two Strings Anagram
LeetCode 1347. 制造字母异位词的最小步骤数 Minimum Number of Steps to Make Two Strings Anagram
|
人工智能 算法
codeforces1068——D.Array Without Local Maximums(计数DP+前缀和优化)
codeforces1068——D.Array Without Local Maximums(计数DP+前缀和优化)
132 0
【1103】Integer Factorization (30分)【DFS】
【1103】Integer Factorization (30分)【DFS】 【1103】Integer Factorization (30分)【DFS】
89 0
【1145】Hashing - Average Search Time (25分)【hash 平方探测法】
【1145】Hashing - Average Search Time (25分)【hash 平方探测法】 【1145】Hashing - Average Search Time (25分)【hash 平方探测法】
110 0
【1117】Eddington Number (25分)【模拟】
【1117】Eddington Number (25分)【模拟】 【1117】Eddington Number (25分)【模拟】
88 0