浅谈考试(24/10/7)

· · 闲话

\color{red}{今天是个嚎日子} \color{red}{全部WA的好日子}

很显然,我的精神状态也是很症猖的啊

T1 P1776 宝物筛选

这道题一眼板子题,就是多重背包转01背包,整体思路不难。但是这道题有个很恶心的问题: 很容易TLE on #9 #10。

解决办法有两个,第一个就是快读快写,但是不知道为什么我是过不了的,甚至会

\color{EABB1E}{CE}

掉(我的快读快写);第二个方法(正解)就是二进制优化,我看到 @fairfriendZ 写出来了,但是问题是我不会,所以只能打到80pts。

T2 P1347 排序

这道题,就是拓扑排序嘛,在第一种情况下就是一个优雅的 DAG ,第二种情况下会出现一个环,第三种情况什么都不是,所以只要 else 就可以了。

因为这道题我 \color{green}{AC} 了,所以挂一下我的代码也恒河狸吧?

#include "bits/stdc++.h"
using namespace std;
const int Xe = 30;
int n, m, pa[Xe];
vector <int> ve[Xe];
bool vis[Xe][Xe];
queue <int> q;
void dfs(int x){
    if (pa[x]) dfs(pa[x]);
    cout << char(x + 'A' - 1);
}
void bfs(int k){
    int s[Xe];
    memset(s, 0, sizeof(s));
    s[0] = 1;
    q.push(0);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for (int i = 0; i < ve[u].size(); i++){
            int v = ve[u][i];
            if (s[v] < s[u] + 1){
                pa[n + 1] = v;
                pa[v] = u;
                s[v] = s[u] + 1;
                q.push(v);
            }
            if (s[v] > n + 2){
                cout << "Inconsistency found after " << k << " relations.";
                exit(0);
            }   
        }
    }
    if (k == m && s[n + 1] != n + 2) cout << "Sorted sequence cannot be determined.";
    if (s[n + 1] == n + 2){
        cout << "Sorted sequence determined after " << k << " relations: ";
        dfs(pa[n + 1]);
        cout << ".";
        exit(0);
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        ve[0].push_back(i);
        ve[i].push_back(n + 1);
    }
    for (int i = 1; i <= m; i++){
        char a, b, c;
        cin >> a >> b >> c;
        if (!vis[a - 'A' + 1][c - 'A' + 1]){
            ve[a - 'A' + 1].push_back(c - 'A' + 1);
            vis[a - 'A' + 1][c - 'A' + 1] = 1;
        }
        bfs(i);
    }

    return 0;
}

感觉自己的马蜂比较凉嚎

T3 P1025 数的划分

我?暴力20pts

似乎这道题 dfsdp 都能过,不过用大法师的话一定要剪枝,不然可能会

\color{030241}{TLE}

,但是动规(或者这里算递推?)可以更加简短一点

也不知道是谁打了50多行纯暴力,仅仅加了一点点优化,结果还是只有20pts,肯定连暴力算法都出问题了

T4 P5322 排兵布阵

我?依旧是暴力20pts,完全因为算法出问题,骗分骗到的20分。

直接把别人说的题解搬过来好了:

比较好想的DP,设 dp[i][j] 表示第 i 个城堡时,已派出 j 个士兵。决策时,贪心派出恰好严格大于某一玩家派出的数量的两倍(不然浪费)。我们发现又可以排序预处理出 a[i][j] 表示第 i 个城堡,出兵数量第 j 大的人出兵数量(因为这样可以很容易算出贡献,即为 k \times i

转移方程:

dp[j] = max(dp[j], dp[j - a[i][k] * 2 - 1] + k * i)

反正就是,这次比赛我一共拿了220pts,还算可以,赶紧备战CSP-S二轮吧,说不定还要去打NOIP。

本次闲话到此结束,我继续去题目里挣扎了。

劇終

(推销一下主页)