Codeforcesラウンド#567(本部2)B.分割数(文字列、貪欲)

B.スプリットナンバー
TEST2の秒あたりの制限時間
test512メガバイトあたりのメモリ制限
入力inputstandard
出力outputstandard
ディマは一日中働き、彼の好きな番号を取り除く長い紙に書き留めたn個リットルの数字からなります。残念ながら、ストリップはそれはディマの本棚に入りきらなかったほど長いことが判明しました。

この問題を解決するために、ディマは、それらのそれぞれは、先行ゼロなしで正の整数が含まれているように、2つの空でない部分にストリップを分割することを決めました。その後、彼は二つの整数の合計を計算し、新しいストリップにそれを書き留め。

それは合計が本棚にそれを収まる可能性が高くなりますので、ディマは、結果の整数はできるだけ小さくなるように望んでいます。ヘルプディマは、彼が入手できる最小の和であるかを決めます。

入力
ディマの好きな数の長さ-最初の行は、単一の整数L(2≤l≤100000)を含みます。

ディマのお気に入り数:2行目は、最初は、ストリップに書かれた正の整数nが含まれています。

整数nは正確にL個の数字から成り、それは先行ゼロを含みません。ディマ保証、ストリップを分割する少なくとも1つの有効な方法があること。

出力は
ディマを得ることができる最小の数-単一の整数を出力します。

例としては、
inputCopy
7
1234567
outputCopy
1801
inputCopy
3
101
outputCopy
11

ディマは整数1234と567その和は1801であるに番号1234567を分割することができ最初の例では。

第2の例ではディマは整数10と1に番号101を分割することができるそれらの合計は、数字がゼロで開始することができないので、「1」と「01」にストリップを分割することは不可能であること11.注意あります。

質問の意図されて:
あなたは2つのブランチに整数ので、あなたに二つの非空部分を整数の文字列表現を与えるために、そして先行ゼロ部分を持つことができない、例えば、Bに、二つの部分、そして求めます別の何+ bの+ B最小出力値を作る方法。
アイデアは:
まず、我々は、すべてではないゼロの桁位置を扱うのベクトルに追加した後、私たちは、ほとんどのベクトル二分探索距離は、(ほとんどの中点によって、答えが最適であるため)を取得した後、半分を列挙するために/ 2最寄りの場所をlenはいくつかの取り付け位置の位置は、+ bを求めては最小値です。出力が可能。

詳細コードを参照してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <bits/stdc++.h>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
string S(ll n){stringstream ss;string s;ss<<n;ss>>s;return s;}
ll N(string s){stringstream ss;ll n;ss<<s;ss>>n;return n;}
string rm0(string s){//  去除前导0函数
    int i;
    for(i=0;i<s.size()-1;i++)
        if(s[i]!='0')
            break;
    return s.substr(i);
}
string ADD(string s,string t) {// 字符串整数相加,返回一个字符串
  if(s.size()<t.size())swap(s,t);s='0'+s;
  reverse(t.begin(), t.end());while(s.size()>t.size())t+='0';reverse(t.begin(), t.end());int c=0;
  for(int i=s.size();i>=0;i--)
  {
    if(c){
        if(s[i]=='9'){
            s[i]='0';c=1;
        }else{
            s[i]=(char)(s[i]+1);c=0;
        }
    }
    int sum=(int)s[i]+(int)t[i]-'0'*2;
    if(sum>=10){
        s[i]=(char)(sum-10+'0');c=1;
    }
    else 
        s[i]=(char)(sum+'0');
  }
  return rm0(s);
}
bool cmp(string s,string t) { 
    // s>=t 返回1
    // s<t 返回0
    if(s.size()!=t.size())
        return s.size()>t.size();
    for(int i=0;i<s.size();i++)
        if(s[i]!=t[i])
            return s[i]>t[i];
  return 1;
}
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    
    int len;
    string str;
    cin>>len>>str;
    std::vector<int> v;
    v.clear();
    rep(i,0,len)
    {
        if(str[i]!='0')
        {
            v.pb(i);
        }
    }
    int k=lower_bound(ALL(v),len/2)-v.begin();
    string ans=str;
    repd(j,-2,3)
    {
        int id=max(1,min(sz(v)-1,k+j));
        string s1=str.substr(0,v[id]);
        string s2=str.substr(v[id]);
        string w=ADD(s1,s2);
        if(cmp(ans,w))
        {
            ans=w;
        }
    }
    cout<<ans<<endl;
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

おすすめ

転載: www.cnblogs.com/qieqiemin/p/11033007.html