Loading

24-2-29 个人赛




A - 减肥计划

难度: ⭐⭐⭐

解题思路

k如果大于等于n - 1, 那么只有队伍中分数最大的那个人可以胜利; 剩下的就可以O(n)解决了, 看看谁能先他一步满足条件; 从第一个人开始, 我们往后找到第一个大于他分数的那个人, 记录差值看是否满足条件即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n, m;
int p[N];
signed main(){
    IOS;
	cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> p[i];
    }
    int x = p[1], pos = 1;
    for(int i = 2; i <= n; i++){
        if(p[i] > x){
            int len = i - pos - (pos == 1);
            if(len >= m){
                cout << pos << endl;
                return 0;
            }
            pos = i;
            x = p[i];
        }
    }
    cout << pos;
	return 0;
}




B - 睡觉

难度: ⭐⭐⭐

解题思路

我们可以先计算一首歌下来小莫的清醒度是否下降, 如果下降了, 那么我们可以循环无限次, 直到满足题意; 如果上升了, 那么合法的区间随着歌曲的循环会越来越短, 所以最佳情况就在前两次播放, 如果放了两次还没有合法的区间, 那么再往后也就没有了; 如果清醒度不变, 我们需要分情况讨论, 如果时间t小于一首歌的时间, 那么就在一首歌时间里面找就行, 如果大于等于一首歌, 那么我们就让整首歌期间一直都是合法的才行;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int p[N];
signed main(){
    IOS;
	int T;
    cin >> T;
    while(T--){
        int x, t, k, n, d;
        cin >> x >> t >> k >> n >> d;
        int cnt = 0;
        for(int i = 1; i <= n; i++){
            cin >> p[i];
            p[n + i] = p[i];
            if(p[i] <= d) cnt--;
            else cnt++;
        }
        if(cnt < 0){
            cout << "YES" << endl;
            continue;
        }
        bool f = false;
        cnt = 0;
        for(int i = 1; i <= 2 * n; i++){
            if(p[i] <= d) x--;
            else x++;
            if(x <= k) cnt++;
            else cnt = 0;
            if(cnt >= t){
                f = true;
                break;
            }
            if(i == n && cnt == n){
                f = true;
                break;
            }
        }
        if(f) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
	return 0;
}




C - 测量学

难度: ⭐⭐

解题思路

模拟就行, 把所有可能的路径都列出来找最小值;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n;
double r, m;
double pi = 3.14159265358;
double p[N];
signed main(){
    IOS;
    cin >> n >> r >> m;
    if(m > pi) m = 2 * pi - m;
    for(int i = 1; i <= n; i++){
        cin >> p[i];
    }
    p[n + 1] = r;
    sort(p + 1, p + 1 + n);
    double res = 1e18;
    for(int i = 1; i <= n + 1; i++){
        double len = 2 * (r - p[i]) + m * p[i];
        res = min(res, len);
    }
    printf("%.30lf", res);
	return 0;
}




D - 排队打卡

难度: ⭐⭐⭐

解题思路

模拟题, 本题坑点和细节比较多; 一是判断日志是否合法, 如果日志中没有t这个时间节点, 那么我们可以给他插入一个方便判断; 二是出队和入队的前后, 以及和条件判断的先后顺序, 这些看题目和代码即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
struct node{
    int t, x;
    bool operator<(const node& a)const{
        return t < a.t;
    }
}p[N];
signed main(){
    IOS;
    int t, n, m, k;
    cin >> t >> n >> m >> k;
    int cnt = 0;
    int f, f1 = 1;
    int minn = inf, res;
    for(int i = 1; i <= m; i++){
        int a, b;
        cin >> a >> b;
        if(a == t) f1 = 0;
        p[i] = {a, b};
    }
    if(f1) p[m + 1] = {t, 0};
    sort(p + 1, p + 1 + m + f1);
    for(int i = 1; i <= m + f1; i++){
        if(i != 1) cnt = max(0ll, cnt - (p[i].t - p[i - 1].t - 1) * k);
        if(p[i].t == t){
            if(cnt != n) f = 0;
            else f = 1;
        }
        cnt += p[i].x;
        if(p[i].t >= t && p[i].x){
            int x = ((cnt + 1) / k) + ((cnt + 1) % k != 0);
            if(x <= minn){
                minn = x;
                res = p[i].t;
            }
        }
        cnt = max(0ll, cnt - k);
    }
    if(f == 0) cout << "Wrong Record";
    else {
        cout << res << ' ' << minn;
    }
	return 0;
}




E - 音乐游戏

难度: ⭐

解题思路

签到题, 没啥好说的; 但是要注意一点, 就算getchar和cin在开启IOS的情况下也不能混用;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353, inf = 1e18;
typedef pair<int, int> PII;
int n, m, res;
signed main(){
    //IOS; 一定不能开
    cin>>n;
    getchar();
    for(int i = 1; i <= n; i++){
        string s;
        getline(cin, s);
        for(int j = 1; j <= 4; j++){
            if(s[j] == '-') res++;
        }
    }
    cout << res;
	return 0;
}
posted @ 2024-03-01 16:21  mostimali  阅读(7)  评论(0编辑  收藏  举报