Codeforces Round #689 (Div. 2, based on Zed Code Competition) 个人题解

1461A. String Generation

void solve() {
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
        cout << (char)(i < k ? 'a' : 'a' + (i - k) % 3);
    cout << endl;
}

1461B.Find the Spruce

DP,从下往上推

const int N = 500 + 10;

char s[N][N];
int dp[N][N];
void solve() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> s[i] + 1;
    int ans = 0;
    for (int i = n; i; i -= 1)
        for (int j = m; j; j -= 1) {
            dp[i][j] = 0;
            if (s[i][j] == '*') {
                if (i < n and j > 1 and j < m)
                    dp[i][j] = 1 + min({dp[i + 1][j - 1], dp[i + 1][j],
                                        dp[i + 1][j + 1]});
                else
                    dp[i][j] = 1;
            }
            ans += dp[i][j];
        }
    cout << ans << endl;
}

1461C. Random Events

贪心

int a[N];
void solve() {
    cout << fixed << setprecision(6);
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    int m = n;
    while (a[m] == m and m)
        m--;
    double ans = 1, p;
    for (int i = 1, r; i <= q; i += 1) {
        cin >> r >> p;
        if (r >= m)
            ans *= 1 - p;
    }
    if (!m)
        cout << 1.0 << endl;
    else
        cout << 1 - ans << endl;
}

1461D.Divide and Summarize

贪心先把能找到的都找出来, \(O(nlog^2n)\)

int a[N];
ll sum[N];
void solve() {
    cout << fixed << setprecision(6);
    int n, m, q;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    sort(a + 1, a + 1 + n);
    // 前缀和
    for (int i = 1; i <= n; ++i)
        sum[i] = sum[i - 1] + a[i];
    set<ll> s;
    // 用新写法
    function<void(int, int)> DFS = [&](int L, int R) {
        s.insert(sum[R] - sum[L - 1]);
        if (a[L] == a[R])
            return;
        int M = upper_bound(a + L, a + R + 1, (a[L] + a[R]) / 2) - a;
        DFS(L, M - 1),DFS(M, R);
    };
    DFS(1, n);
    for (int i = 1; i <= m; ++i) {
        cin >> q;
        cout << (s.count(q) ? "Yes\n" : "No\n");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值