社区讨论

50分求调

P14460【MX-S10-T1】『FeOI-4』寻雾启示参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhqm3c1s
此快照首次捕获于
2025/11/09 02:22
3 个月前
此快照最后确认于
2025/11/16 14:04
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

int T;
long long dp1[100001];
long long dp2[100001];

int main() {
    cin >> T;
    bool b1 = false;
    for (int i = 1; i <= T; i++) {
        bool b2 = false;
        memset(dp1, 0x3f, sizeof(dp1));
        memset(dp2, 0x3f, sizeof(dp2));
        int m, k, t2, t1;
        cin >> m >> k >> t1 >> t2;
        dp1[0] = 0;
        dp2[0] = 0;
        for (int j = 0; j <= m; j++) {
            long long t3 = dp1[j] - dp2[j] + j * t2;
            long long k1 = t3/k;//(dp2[j]+t3)/k - (dp2[j])/k
            long long f = k1;
            if (k1 != 0 and j + f <= m ) {
                for(int g=1;g<=f;g++){
                    if(dp1[j + g] > dp2[j] + t3 + j * t2 + g * t1){
                        dp1[j + g] = dp2[j] + t3 + j * t2 + g * t1;
                        dp2[j + g] = dp2[j] + t3;
                    }
                }
            }
            for (long long f = k1+1; j + f <= m; f++) {
                if (k1 + 1 > m - j) continue;
                long long tt = k - ((dp2[j]+t3)%k) + (f - k1 -1) * k;
                if(((dp2[j]+t3)%k)==0){
                    tt = (f - k1) * k;
                }
                //long long tt = k * (k1 + 1) - t3 + (f - k1 - 1) * k;
				//if(tt<0){
				//cout << "K1:" << k1 << "t3:" << t3 << "f:" << f << endl;
				//}
                if (dp1[j + f] >= dp2[j] + t3 + tt + j * t2 + f * t1) {
                    dp1[j + f] = dp2[j] + t3 + tt + j * t2 + f * t1;
                    dp2[j + f] = dp2[j] + t3 + tt;
                }
            }
        }
        if (b1)
            cout << endl;
        b1 = true;
        for (int u = 1; u <= m; u++) {
            if (b2)
                cout << " ";
            b2 = true;
            cout << dp1[u];
        }
    }
    return 0;
}

回复

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

正在加载回复...