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;
}