小白月赛88

A 超级闪光牛可乐

需要投喂超过 x

可以随便用

for (int i = 0;i < 1000;i++){
	cout << ch;
}

B 人列计算机

判断简单的与或非门并计算结果

void solve() {
    char ch;
    string s = "";
    while (cin >> ch) {
        if (ch == '0' || ch == '1' || ch == '&') {
            s += ch;
        }
    }
    int x = 0;
    if (s.size() == 2)
        x = (s[0] - '0') ^ 1;
    else {
        if (s[1] == '1') {
            x = (s[0] - '0') | (s[2] - '0');
        } else {
            x = (s[0] - '0') & (s[2] - '0');
        }
    }
    cout << x << '\n';
}

C 时间管理大师

要在事件开始前 1,3,5 分钟定闹钟,求总共要定多少个闹钟

void solve() {
    int n;cin >> n;
    vector<pair<int, int>> a(n + 1);
    set<pair<int, int>> s;
    for (int i = 1;i <= n;i++) {
        cin >> a[i].first >> a[i].second;
        if (a[i].second >= 1)
            s.insert({a[i].first,a[i].second - 1});
        else
            s.insert({a[i].first - 1,59});
        if (a[i].second >= 3)
            s.insert({a[i].first,a[i].second - 3});
        else
            s.insert({a[i].first - 1,60 + a[i].second - 3});
        if (a[i].second >= 5)
            s.insert({a[i].first,a[i].second - 5});
        else
            s.insert({a[i].first - 1,60 + a[i].second - 5});
    }
    cout << s.size() << '\n';
    for (auto [x, y] : s)cout << x << " " << y << '\n';
}

D 我不是大富翁

原:D. Rudolf and the Ball Game

判断走 m 次,有没有路径最终回到 1 号

坑点:x 必须要 modn 不然在 p[(j - x + n) % n] 下标将会变成负数。

void solve() {
    int n, m;cin >> n >> m;
    vector<int> dp(n);
    dp[0] = 1;
    for (int i = 0;i < m;i++) {
        int x;cin >> x;x %= n;
        vector<int> p(n);
        for (int j = 0;j < n;j++) {
            if (dp[j]) {
                p[(j + x) % n] = 1;
                p[(j - x + n) % n] = 1;
            }
        }
        dp = p;
    }
    cout << (dp[0] ? "YES\n" : "NO\n");
}

E 多重映射

给出一个数组 a,和 m 次修改,每次修改会将所有的 xi 修改为 yi,求修改完最终的数组。

Solution

映射/并查集/map

for (int i = 0; i <= 1e6; i++) to[i] = i;
void solve() {
    int n, m;
    cin >> n >> m;
    //输入
    for (int i = 0; i < n; i++) cin >> a[i];
    //储存操作
    for (int i = 0; i < m; i++)
        cin >> u[i] >> v[i];
    //逆向存储
    for (int i = m - 1; i >= 0; i--)
        to[u[i]] = to[v[i]];
    //正向对映
    for (int i = 0; i < n; i++)
        cout << to[a[i]] << " \n"[i == n - 1];
    //处理to[]防止影响到下一组数据
    for (int i = m - 1; i >= 0; i--) {
        to[u[i]] = u[i];
        to[v[i]] = v[i];
    }
}
void solve()
{
    int n, m;
    cin >> n >> m;
    //创建数组
    vector<int> a(n), u(m), v(m);
    //相当于写法1中的to[]
    map<int, int> mp;
    for(int i = 0; i < n; i ++) cin >> a[i];
    for(int i = 0; i < m; i ++)
        cin >> u[i] >> v[i];
    for(int i = m - 1; i >= 0; i --)
    {
        //如果mp中的元素中有v[i]
        //映射串联起来
        if(mp.count(v[i])) mp[u[i]] = mp[v[i]];
        //否则,直接赋值
        else mp[u[i]] = v[i];
    }
    //如果mp[]中没有对映的映射,则为它本身
    // 否则输出对映的映射
    for(int i = 0; i < n; i ++)
        cout << (mp[a[i]] ? mp[a[i]] : a[i]) << " \n"[i == n - 1];
}

F 现在是消消乐时间

给出一个 n×m 的矩形,下方有 d 行空白行,可以选择一个发射地点,从左上,右上,左下,右下 45 度 4 个方向中选择一种,看走的路线是否能够穿过全部方块。

Solution

数论/找规律/搜索/构造

题解 | 现在是消消乐时间_牛客网

#include<cstdio>
#include<numeric>

int n,m,d,k;

int main(){
	scanf("%d%d%d",&n,&m,&d);
	k=std::gcd(n,m);
	if(d==n||k==1)printf("YES\n0 0\nUR");
	else if(k==2)printf("YES\n0 1\nUL");
	else puts("NO");
}

G 三点不共线

给出 2 个点的坐标和要求构造的角度 α,求另外一个点的坐标与那两个点的角度刚好为 α

Solution

构造
牛客小白月赛88 出题人题解
(待更 )