Contestant. Rank 1053. Rating +125.

A. Double Click

题意

定义两个点击时刻 \(s_1, s_2\) 的差小于等于某个值 \(D\) 时视为在靠后的时间点 \(s_2\) 时触发双击。

给定一个点击时刻的序列,判断哪个时刻触发了第一次双击。无双击输出 \(-1\)

思路

如题,模拟即可。

时间复杂度:\(O(n)\)

对应AC代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define fs first
#define sc second

const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;

void init(){}

void solve() {
    int n, d;
    cin >> n >> d;
    int ans = -1;
    int pre;
    cin >> pre;
    for(int i=1;i<n;i++){
        int cur;
        cin >> cur;
        if(cur - pre <= d && ans == -1) ans = cur;
        pre = cur;
    }
    cout << ans << '\n';
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init();
    int t = 1;
    //cin >> t;
    while(t --) solve();
}

再点一次返回到主页面

B. chess960

题意

给定一个由 \(KQRRBBNN\) 经过任意排列后的字符串,输出其是否满足下面的要求:

  1. \(B\) 的两个下标的奇偶性不同;

  2. \(K\) 在两个 \(R\) 中间

思路

如题,模拟即可。

时间复杂度:\(O(1)\)

对应AC代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define fs first
#define sc second

const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;

void init(){}

void solve() {
    string s;
    cin >> s;
    int k, q;
    vector<int> r, b, n;
    for(int i=0;i<8;i++){
        char x = s[i];
        if(x == 'K') k = i;
        else if(x == 'Q') q = i;
        else if(x == 'R') r.emplace_back(i);
        else if(x == 'B') b.emplace_back(i);
        else if(x == 'N') n.emplace_back(i);
    }
    bool ans = true;
    if(b[0] % 2 == b[1] % 2) ans = false;
    if(k < r[0] || k > r[1]) ans = false;
    cout << (ans ?"Yes\n" : "No\n");
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init();
    int t = 1;
    //cin >> t;
    while(t --) solve();
}

两面包夹芝士

C. PC on the Table

题意

给定 \(H\) 个由 "." 和 "T" 组成的字符串,规定两个相邻的 \(T\) 可以替换为 \(PC\),输出替换次数最多的一种方案。

思路

直接暴力枚举替换即可。

时间复杂度:\(O(nm)\)

对应AC代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define fs first
#define sc second

const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;

void init(){}

void solve() {
    int n, m;
    cin >> n >> m;
    for(int i=0;i<n;i++){
        string s;
        cin >> s;
        for(int j=1;j<m;j++){
            if(s[j] == s[j - 1] && s[j] == 'T'){
                s[j - 1] = 'P';
                s[j] = 'C';
                j ++;
            }
        }
        cout << s << '\n';
    }
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init();
    int t = 1;
    //cin >> t;
    while(t --) solve();
}

PC?

D. Count Subtractions

题意

给定两个数 \(A, B\),规定一次操作为将较大的数减去较小的数。

输出让两数相等的最小操作数。

思路

这题可以等价为重复操作直到某一个数变为 \(0\),那么我们将计算得到的结果 \(-1\) 即可。

\(A > B\),那么在 \(A\) 减到小于等于 \(B\) 后,值恰好为 \(A \bmod b\),此时操作数就是 \(\lfloor\frac{a}{b}\rfloor\)

如上,我们暴力即可。

时间复杂度:反正还行吧(

对应AC代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define fs first
#define sc second

const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;

void init(){}

void solve() {
    int a, b;
    cin >> a >> b;
    int ans = 0;
    while(a != 0 && b != 0) {
        if(b > a) swap(a, b);
        ans += a / b;
        a %= b;
    }
    cout << ans - 1 << '\n';
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init();
    int t = 1;
    //cin >> t;
    while(t --) solve();
}

暴力暴力

E. Kth Takoyaki Set

题意

给定一个序列,通过任选数量、任选元素相加得到新的序列,序列升序且无重复元素,输出序列中第 \(k\) 个数,其中 \(k\) 给定。

思路

我们可以直接暴力。

首先,我们希望可以找到一个与当前最大值最接近的那个数,或者说,将组成最大值的某个数替换,这样通过递推就可以使构造出来的序列的相邻元素差值最小。

所以,我们不妨用 \(set\) 去重并顺便排序,对于查找与当前最大值最接近的那个数,我们可以用二分。

思路具有一定的贪心性,此处暂时不给出证明(

时间复杂度:\(O(pn \log p)\)

对应AC代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define fs first
#define sc second

const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 1e9 + 7;

void init(){}

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin >> a[i];
    set<int> st;
    st.emplace(0);
    while(st.size() != k + 1){
        int mx = *st.rbegin(), now = inf;
        for(int i=0;i<n;i++){
            now = min(now, *st.upper_bound(mx - a[i]) + a[i]);
        }
        st.emplace(now);
    }
    cout << *st.rbegin() << '\n';
}

signed main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    init();
    int t = 1;
    //cin >> t;
    while(t --) solve();
}

其实是不会证(x