ABC309

发布时间 2023-07-08 23:50:40作者: V_Melville

T1:Nine

\(A+1 = B\)\(A \% 3 = 1\) 时,说明 \(A\)\(B\) 相邻

代码实现
a, b = map(int, input().split())
if a+1 == b and a%3 != 0:
    print('Yes')
else:
    print('No')

T2:Rotate

模拟

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using P = pair<int, int>;

int main() {
    int n;
    cin >> n;
    
    vector<string> a(n);
    rep(i, n) cin >> a[i];
    
    vector<P> ps;
    rep(i, n-1) ps.emplace_back(0, i);
    rep(i, n-1) ps.emplace_back(i, n-1);
    rep(i, n-1) ps.emplace_back(n-1, n-1-i);
    rep(i, n-1) ps.emplace_back(n-1-i, 0);
    
    auto b = a;
    int m = ps.size();
    rep(mi, m) {
        auto [i, j] = ps[mi];
        auto [ni, nj] = ps[(mi+1)%m];
        b[ni][nj] = a[i][j];
    }
    
    rep(i, n) cout << b[i] << '\n';
    
    return 0;
}

T3:Medicine

对于第 \(i\) 天所吃的药的总和为 \(s_i\),我们可以将相同的 \(s_i\) 划分为一组

比如样例1:

1:  19
2:  10
3:  5
4:  5
5: 3
6: 3
7: 0

可以将 \(5, 5\) 划分为一组,\(3, 3\) 划分到一组,其他数单独为一组

考虑对序列 \((a_i, s_i)\)\(a_i\) 的大小进行升序排序
可以发现,如果 \(s_{i+1} \neq s_i\),那么 \(s_{i+1}\) 一定在新的组中,我们只需考虑同一个 \(s_i\) 第一次出现的位置即可
于是,我们可以仅对序列 \((a_i, b_i)\)\(a_i\) 的大小进行升序排序
在我们扫描序列 \((a_i, b_i)\) 时,可以通过当前组的 \(s\) 减去 \(b_i\) 就能得到新的一组的 \(s\)

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;
using P = pair<int, int>;

int main() {
    int n, k;
    cin >> n >> k;
    
    vector<P> ps;
    ll tot = 0;
    rep(i, n) {
        int a, b;
        cin >> a >> b;
        ps.emplace_back(a, b);
        tot += b;
    }
    
    if (tot <= k) {
        puts("1");
        return 0;
    }
    
    sort(ps.begin(), ps.end());
    
    for (auto [a, b] : ps) {
        tot -= b;
        if (tot <= k) {
            cout << a+1 << '\n';
            return 0;
        }
    }
    
    return 0;
}