暑期cspj模拟赛7

已结束 ACM/ICPC 开始于: 2025-8-19 18:00 24 小时 主持人: 9

暑期cspj模拟赛7

T1

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// 检查字符串s是否以prefix为前缀
bool isPrefix(const string& s, const string& prefix) {
    if (s.length() < prefix.length()) {
        return false;
    }
    for (int i = 0; i < prefix.length(); ++i) {
        if (s[i] != prefix[i]) {
            return false;
        }
    }
    return true;
}

int main() {
    freopen("prefix.in", "r", stdin);
    freopen("prefix.out", "w", stdout);

    string target;
    int n;
    
    // 读取目标字符串
    cin >> target;
    // 读取字符串数量
    cin >> n;
    
    vector<string> candidates;
    
    // 读取所有字符串并筛选出符合条件的
    for (int i = 0; i < n; ++i) {
        string s;
        cin >> s;
        if (isPrefix(s, target)) {
            candidates.push_back(s);
        }
    }
    
    // 按字典序排序
    sort(candidates.begin(), candidates.end());
    
    // 输出字典序最小的字符串
    cout << candidates[0] << endl;
    
    return 0;
}

T2

一定是一只左右牵右手 所以最大的左手 牵最大的 右手 以此类推

#include <bits/stdc++.h>
using namespace std;

int n;
int L[100010];
int R[100010];

int main() {
    freopen("seat.in", "r", stdin);
    freopen("seat.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> L[i] >> R[i];
	}

	sort(L + 1, L + n + 1);
	sort(R + 1, R + n + 1);

	long long ans = 0;
	for (int i = 1; i <= n; i++) {
		ans += max(L[i], R[i]);
	}
	cout << ans  + n << endl;

}

T3

#include <bits/stdc++.h>
using namespace std;

const int N = 305;

int n, a, b, c;
int s[N];
long long dp[N][N];

// 区间DP求解消除游戏
long long solve() {
    for (int len = 1; len <= n; ++len) {
        for (int l = 1; l + len - 1 <= n; ++l) {
            int r = l + len - 1;
            
            // 情况1:单独消除s[l]
            dp[l][r] = dp[l+1][r] + a;
            
            // 情况2:与右边相同颜色的球一起消除
            for (int k = l + 1; k <= r; ++k) {
                if (s[k] == s[l]) {
                    // 消除s[l]和s[k]之间的区间,然后一起消除s[l]和s[k]
                    long long val = 0;
                    
                    // 计算左右两边的值
                    long long left_val = (l + 1 <= k - 1) ? dp[l+1][k-1] : 0;
                    long long right_val = (k + 1 <= r) ? dp[k+1][r] : 0;
                    
                    // 2个一起消除
                    if (k == l + 1) {
                        val = right_val + b;
                    } else {
                        val = left_val + right_val + b;
                    }
                    dp[l][r] = max(dp[l][r], val);
                    
                    // 3个一起消除的情况
                    for (int m = l + 1; m < k; ++m) {
                        if (s[m] == s[l]) {
                            long long val3 = 0;
                            if (l + 1 <= m - 1) val3 += dp[l+1][m-1];
                            if (m + 1 <= k - 1) val3 += dp[m+1][k-1];
                            if (k + 1 <= r) val3 += dp[k+1][r];
                            val3 += c;
                            dp[l][r] = max(dp[l][r], val3);
                        }
                    }
                }
            }
        }
    }
    
    return dp[1][n];
}

int main() {

    freopen("game.in", "r", stdin);
    freopen("game.out", "w", stdout);

    scanf("%d%d%d%d", &n, &a, &b, &c);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &s[i]);
    }
    
    long long ans = solve();
    printf("%lld\n", ans);
    
    return 0;
}

T4

先考虑 每一个 a>b对,只要算出a之前小于b的个数 和b之后 大于a的个数,两者相乘累加即可

#include <bits/stdc++.h>
using namespace std;

const int N = 5005;

int n, a[N];
long long ans;
short les[N][N];
short gre[N][N];

int main() {

    freopen("quater.in", "r", stdin);
    freopen("quater.out", "w", stdout);

    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }


    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            les[i][j] = les[i - 1][j];
            if (a[i] < j) {
                les[i][j]++;
            }
        }
    }

    for (int i = n; i >= 1; --i) {
        for (int j = 1; j <= n; ++j) {
            gre[i][j] = gre[i + 1][j];
            if (a[i] > j) {
                gre[i][j]++;
            }
        }
    }


    for (int i = 2; i <= n; ++i) {
        for (int j = i+1; j < n; ++j) {
            if (a[i] > a[j]) {
                ans += 1LL*les[i-1][a[j]] * gre[j+1][a[i]];
            }
        }
    }

    printf("%lld\n", ans);

    return 0;
}
状态
已结束
规则
ACM/ICPC
题目
4
开始于
2025-8-19 18:00
结束于
2025-8-20 18:00
持续时间
24 小时
主持人
参赛人数
9