开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
A. 减肥计划
YahAHa 是一个嘴馋的孩子,他每天都要吃大量的零食,这导致他的体重严重超标,因此他的打算减肥,但他希望有人能陪他一起减肥,于是 YahAHa 组织了一场游戏,获胜者将被 YahAHa 选中。
游戏的规则如下: 个参与者排成一队,游戏从队列中的第 个人(从左到右)开始,每一轮由队列的前 个人进行游戏,如果第 个人的体重 队列中的第 个人的体重 ,那么第 个人获胜,第 个人离开队列并重新加入到队尾(成为队列中的最后一个人),反之第 个人获胜,第 个人离开队列并重新加入到队尾,之后继续进行游戏,如果某一个人连续获胜 轮,那么游戏结束,这个人成为最终的获胜者。
已知一开始队列中每个人的体重,YahAHa 想知道最终获胜的是谁。
- 解法
我们可以发现对于一个数只有到达比他大的数的时候才会停止,所有我们通过遍历去找第一个比他大的数并且记录路径上小于等于它的数,如果一个数可以遍历到n就代表着这个数字是这个数组中最大的数字是肯定可以符合题意得
- Code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
int a[N], s[N], c[N];
void solve() {
int n, k; scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%d",a + i);
int cnt = 0, t = 0;
for(int i = 1; i <= n; i++) {
if(a[t] < a[i]) {
t = i;
cnt = 1;
}else {
cnt ++;
}
if(cnt == k) {
printf("%d\n", t);
return;
}
}
printf("%d\n", t);
}
int main()
{
int T = 1;
// scanf("%d", &T);
while(T--) solve();
return 0;
}
C. 测量学
YahAHa 是虎纠大学的学生。作为 HJU-ACM 的队员,他每天要从生活区走到实验室参加训练。
HJU 的教学楼群大体上是以图书馆中心为圆心,呈若干个同心圆的分布。
经过测量,YahAHa 发现,生活区和实验室都位于半径为 的大道上;从图书馆到大道上一共有 条同心圆小道,他们的半径分别为 到 。YahAHa 可以在任意同心圆小道上,顺时针或逆时针地绕着小道行走。
此外,HJU 的教学楼群中,有两条大道分别从图书馆直通生活区和实验室。直通生活区的那条大道绕图书馆逆时针旋转 的弧度即和直通实验室的大道重合。
现在,每天准时上班的 YahAHa 想知道,他从生活区出发前往实验室,最短的路程是多长呢?
- 解法
我们得路径肯定是通过弧长经过的弧长的公式是,通过这个我们枚举一下即可
- Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <stack>
using namespace std;
using ll = long long;
#define int long long
#define endl '\n'
#define pb push_back
#define NO cout << "NO" << endl;
#define YES cout << "YES" << endl;
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define rep(i,n) for(int i = 1; i <= n; i++)
typedef pair<int,int> PII;
const int N = 2e5 + 10;
int a[N];
void solve()
{
int n; double r, x;
cin >> n >> r >> x;
rep(i,n) cin >> a[i];
sort(a + 1,a + 1 + n,[](int a,int b) {
return a > b;
});
x = min(x, 3.1415926 * 2 - x);
double res = r * x ;
for(int i = 1; i <= n; i++) {
res = min(res, 2 * (r - a[i]) + a[i] * x);
}
printf("%.10lf", res);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
// int T;cin >> T;
// while ( T -- )
solve();
return 0;
}
E. 睡觉
YahAHa 最近失眠了,他这几天睡觉经常听着他最喜欢的歌,希望可以帮助入睡。但是这样过了几天,他发现他还是睡不着,他开始怀疑这首歌有问题。
我们用一个整数来衡量 YahAHa 的清醒度 ,如果连续经过 秒清醒度都小于等于 ,他就可以顺利入睡,清醒度在最开始时为 ,且 。
当他准备睡觉时,他会从头开始循环播放他最喜欢的歌,这首歌一共有 秒,每秒一个数字 表示这首歌第 秒的分贝值。如果第 秒时,分贝值 小于等于 ,在第 秒的开始,YahAHa 的清醒度会减少 1,否则 YahAHa的清醒度会增加 1 。
介于最近的持续失眠,他想问问你,从他每晚放这首歌开始(即" 清醒度连续 秒小于等于 " 只从歌曲播放后开始计算),在无限长的时间内,他能否成功的入睡。如果可以请你输出"YES",不能请输出"NO"。
- 解法
我们先遍历一遍看可不可以如果n秒过后我们的清醒度是下降的就证明肯定可以,上升的肯定不行,相等的时候我们需要特判一下x的最大值都小于k的情况
- Code
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <stack>
using namespace std;
using ll = long long;
#define int long long
#define endl '\n'
#define pb push_back
#define NO cout << "NO" << endl;
#define YES cout << "YES" << endl;
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define rep(i,n) for(int i = 1; i <= n; i++)
typedef pair<int,int> PII;
const int N = 1e6 + 11;
int a[N];
void solve()
{
int x, t, k, n, d; cin >> x >> t >> k >> n >> d;
rep(i,n) {
cin >> a[i];
for(int j = 0; j < 10; j++)
a[i + j * n] = a[i];
}
int mx = 0;
int y = x, cnt = 0;
rep(i,n * 10) {
if(a[i] <= d) y --;
else y ++;
mx = max(mx, y);
if(y <= k) cnt ++;
else cnt = 0;
if(cnt >= t) {
YES return;
}
}
if(y < x) YES
else if(y == x) {
if(mx <= k) YES
else NO
} else NO
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;cin >> T;
while ( T -- )
solve();
return 0;
}