社区讨论

最后两个点RE 求助

P6509[COCI2007-2008] JEDNAKOST参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8ywput
此快照首次捕获于
2023/10/28 02:49
2 年前
此快照最后确认于
2023/10/28 02:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int N = 1e3 + 1;
string s; int n;
string pre; int nex;
int dp[N][5001], f[N][5001];
vector<int> q;

int main(){
    cin >> s;
    for(int i = 0; i < s.size(); ++i)if(s[i] == '=')n = i;
    pre = ' ' + s.substr(0, n); nex = stoi(s.substr(n + 1, s.size() - n - 1));
    memset(dp, 127, sizeof(dp)); dp[0][0] = 0;
    for(int i = 1; i <= n; ++i){
        int tp = 0, x = 1;
        for(int j = i; j >= 1; --j){
            // long long tp = stoull(pre.substr(j, i - j + 1));
            // if(tp > nex)break;
            tp += (pre[j] - '0') * x, x *= 10;
            if(tp > nex)break;
            for(int k = nex; k >= tp; --k){
                dp[i][k] = min(dp[i][k], dp[j - 1][k - tp] + 1);
                if(dp[j - 1][k - tp] + 1 == dp[i][k]){
                    f[i][k] = j;
                }
            }
        }
    }

    //cout << dp[n][nex] << '\n';
    int now = n; int zzz = nex;
    while(now){
        int pos = f[now][nex]; q.push_back(pos);
        int tp = stoi(pre.substr(pos, now - pos + 1));
        now = pos - 1; nex -= tp;
    }
    sort(q.begin(), q.end()); int p = 1; string ans = "";
    for(int i = 1; i <= n; ++i){
        ans += pre[i];
        if(i + 1 <= n && i + 1 == q[p]){
            ans += '+'; ++p;
        }
    }
    ans += "=" + to_string(zzz);
    cout << ans << '\n';
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...