Nebius Welcome Round (Div. 1 + Div. 2) 题解 A - D
Nebius Welcome Round (Div. 1 + Div. 2) 题解 A - D,这四题的整体难度不大,都是过题人数上千的题。
很久没打Codeforces了,在此记录一篇题解,开学了也会不断更新的。
作者:Eriktse
简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)
个人博客:www.eriktse.com
A. Lame King
题意:
在一个大小为201x201的网格上,每次操作可以往“上下左右”四个方向移动一格或者不动,耗时1秒。一个人从(0, 0)出发,问到达(a, b)所需的时间,要求不能出现连续两次向一样的方向移动(意思是可以暂停一秒再动)。
思路:
首先把坐标换成绝对值,表示往x, y两个方向需要移动的距离a
和b
。
不难发现这俩其实是等价的对吧,我们就不妨设a >= b
。
当a == b
时有ans = a + b
,只要一直“右上右上”或者“上右上右”地走就行了。
当a > b
时,我如果想让x坐标到达a
,那起码要走a
次“向右”,然后会产生a - 1
个间隙,我们可以往里面放上b
个“向上”,剩余的放“暂停”就行了。答案是a + (a - 1)
。
所以ans = a + max(a - 1, b)
。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
int a, b;scanf("%lld %lld", &a, &b);
if(a < 0)a = -a;
if(b < 0)b = -b;
if(a < b)swap(a, b);//保证a >= b
int ans = a + max(a - 1, b);
printf("%lld\n", ans);
}
signed main()
{
int _;scanf("%lld", &_);
while(_ --)solve();
return 0;
}
B. Vaccination
题意:
现在有n
个病人需要打疫苗,每个病人可以等待w
单位时间,每箱疫苗有k
支,每箱疫苗开箱后就立刻全部取出并开封,每支疫苗在开封后的保质时间为d
单位时间。现在给出n
个病人开始等待的时间序列,问至少消耗多少箱疫苗。
思路:
模拟 + 贪心。考虑当“疫苗用尽或疫苗过期”的时候需要开封新的疫苗,再考虑“开封新的疫苗的时间应该尽可能晚,这样能让尽可能减少过期的疫苗”。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5 + 9;
int t[maxn];
void solve()
{
int n, k, d, w;scanf("%lld %lld %lld %lld", &n, &k, &d, &w);
//每箱疫苗有k支,每支保质时间d,病人等待时间w
for(int i = 1;i <= n; ++ i)scanf("%lld", t + i);
int ans = 0, cnt = 0, st = 0;//st是开封时间,cnt是当前疫苗支数
for(int i = 1;i <= n; ++ i)
{
//当疫苗耗尽或疫苗过期就开封新的疫苗,但是要赶在当前病人走的最后时刻开封
if(cnt == 0 || st + d < t[i])st = a[i] + w, cnt = k, ans ++;//尽可能晚开封
cnt --;//消耗掉一支疫苗
}
printf("%lld\n", ans);
}
signed main()
{
int _;scanf("%lld", &_);
while(_ --)solve();
return 0;
}
C. Pull Your Luck
题意:
有一个大小为n
的轮盘(下标对n取模的循环数组),当前指针位置为x
,当用f
的力量去转动轮盘,轮盘指针会向前移动f + (f - 1) + (f - 2) + ... + 1
个位置,现在你的力量介于[1, p]
,问有没有可能使得指针指向0
。
所有样例的n
之和不超过2e5
。
思路:
实际上就是要让指针前进(n - x) % n
位嘛,取模是因为x可能等于0,每次前进的距离起始是等差数列求和f * (f + 1) / 2
。
值得注意的是力量不能为0,且力量上限可能非常大,所以1 ~ p
枚举每一个f
显然是不可行的。实际上当p
较大时,我们只需要枚举到2n
就够了。
判断的方法是:存在力量i
满足(i * (i + 1) / 2) % n == (n - x) % n
时,答案为Yes
,若不存在则答案为No
。
简单解释一下这个2n:先考虑什么情况下会回到原地,即
(i * (i + 1) / 2) == 0
,当i == 2 * n
的时候,存在(2n * (2n + 1) / 2) % n == 0
必然成立,然后下一步是往前走2n + 1
步,等价于1
步,周期开始,相当于回到原点开始走第一步。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5 + 9;
int a[maxn];
void solve()
{
int n, x, p;scanf("%lld %lld %lld", &n, &x, &p);
int ans = false;
for(int i = 1;i <= min(p, n * 2); ++ i)
if((i * (i + 1) / 2) % n == (n - x) % n)ans = true;
printf("%s\n", ans ? "Yes" : "No");
}
signed main()
{
int _;scanf("%lld", &_);
while(_ --)solve();
return 0;
}
本文由eriktse原创,未经允许禁止转载。
D. Accommodation
题意:
一栋楼有n
层,每层m
个窗户,每个窗户要么亮灯(1表示)要么关灯(0表示),且每一层一定有准确的m / 4
个双人间(由两个连续的窗户构成),和m / 2
个单人间,这两种房间的窗户加起来恰好m
个窗户,但是你不知道哪些窗户是单人间的,哪些是双人间的。
现在定义,当窗户开了灯说明这一户有人,当关灯说明没人。问你这栋楼最少人数和最多人数。
思路:
每层楼之间相互独立,所以可以单独计算最后加起来就行。
不难发现,单人间很好处理,有多少1
就有多少户人嘛,主要是双人间不太好搞。
双人间可以有4种情况:00
, 01
, 10
, 11
。其中只有双人间选择为11
的时候会影响到最终的人数,即使得总人数-1。
最少人数就是“尽可能多选择11
的双人间”,最多人数就是“尽可能少选择11
的双人间”,可以分别通过连续1的方法和模拟贪心的方法求得。
先讲最少人数,我们可以求出01串中所有连续的1的个数,假如有5个1连在一起,那就可以构成至多5 / 2 = 2
个11
双人间。通过处理出每一段连续1对结果的贡献,我们可以求得最多选出多少个11
双人间,再和m / 4
取个小,因为最多m / 4
个双人间。
再看看最多人数,我们可以从头到尾扫描,当遇到01
,10
,00
就直接将其设为双人间,剩余的自动变成单人间就好,同样注意m / 4
。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e5 + 9;
char s[maxn];
signed main()
{
int n, m;scanf("%lld %lld", &n, &m);
int ans_min = 0, ans_max = 0;
for(int i = 1;i <= n; ++ i)
{
scanf("%s", s + 1);
int all0 = 0, all1 = 0;//all0, 1表示整个字符串中01的个数
int c1 = 0, c0 = 0;//这是临时变量
int k00 = 0, k11 = 0;
for(int j = 1;j <= m; ++ j)
{
if(s[j] == '1')
{
all1 ++;
c1 ++;
if(c0)k00 += c0 / 2, c0 = 0;
}else
{
all0 ++;
c0 ++;
if(c1)k11 += c1 / 2, c1 = 0;
}
}
if(c1)k11 += c1 / 2, c1 = 0;
if(c0)k00 += c0 / 2, c0 = 0;
ans_min += all1 - min(m / 4, k11);
int y = 0;
for(int j = 1;j < m; ++ j)
{
if(s[j] != s[j + 1] || s[j] == '0')y ++, j ++;
}
ans_max += all1 - max(0ll, m / 4 - y);
}
printf("%lld %lld\n", ans_min, ans_max);
return 0;
}
本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞、收藏、留言
Nebius Welcome Round (Div. 1 + Div. 2) 题解 A - D的更多相关文章
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)
这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...
- CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort 暴力枚举,水 1.题意:n*m的数组, ...
- Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 菜鸡只会ABC!
Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) 全场题解 菜鸡只会A+B+C,呈上题解: A. Bear and ...
- Codeforces Round #581(Div. 2)
Codeforces Round #581(Div. 2) CF 1204 A. BowWow and the Timetable 题解:发现,$4$的幂次的二进制就是一个$1$后面跟偶数个$0$. ...
- Codeforces Round #792 (Div. 1 + Div. 2) A-E
Codeforces Round #792 (Div. 1 + Div. 2) A-E A 题目 https://codeforces.com/contest/1684/problem/A 题解 思路 ...
- VK Cup 2012 Round 3 (Unofficial Div. 2 Edition)
VK Cup 2012 Round 3 (Unofficial Div. 2 Edition) 代码 VK Cup 2012 Round 3 (Unofficial Div. 2 Edition) A ...
- Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...
- Codeforces Round #438 (Div.1+Div.2) 总结
本来兴致勃勃的想乘着这一次上紫,于是很早很早的到了机房 但是好像并没有什么用,反而rating-=47 Codeforces Round #438(Div.1+Div.2) 今天就这样匆匆的总结一下, ...
- Codeforces Round #792 (Div. 1 + Div. 2) // C ~ E
比赛链接:Dashboard - Codeforces Round #792 (Div. 1 + Div. 2) - Codeforces C. Column Swapping 题意: 给定一个n*m ...
随机推荐
- python机器学习——PCA降维算法
背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法.所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向 ...
- leetcode 875. 爱吃香蕉的珂珂
珂珂喜欢吃香蕉.这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 h 小时后回来. 珂珂可以决定她吃香蕉的速度 k (单位:根/小时).每个小时,她将会选择一堆香蕉, ...
- 解决idea中按退格键(Backspace)回到上一行问题
开始学习java时,第一次用idea,该问题困扰一上午,网上也没有解决方案,最后自己摸索如下.打开File-> Settings->Editor->Smart Keys,将To pr ...
- nuxt.js的生命周期
nuxt的生命周期分为客户端生命周期,服务端生命周期 1.服务端的生命周期 执行顺序为:nuxtServerlnit(store,context){}, 类似于vue.js中的main.js.可以在 ...
- LINUX配置固定IP以及DNS
配置固定ip #vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=no ...
- 将本地文件复制到docker 容器中
查询容器id: docker ps 查询完整容器id docker inspect -f '{{.ID}}'短容器id cp docker cp 本地路径 完整容器ID:容器路径例: docker c ...
- 上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE
+00:02 +00:16 +01:08 +02:07 VP 情况 4/8 ABCE ,赛时排名可以到823,什么时候我可以上个青 B 本想写个map的二分的,发现自己不会,写了个普普通通的二分 ...
- 弹框tabel
<el-dialog title="删除数据类型" :visible.sync="isDataType" width="60%" :b ...
- 2020/03/24 HTML基础复习笔记
2020-03-24 15:49:30 下午好! 这是我开通博客的第二天也是在钉钉上网课的又一天,为了应对考试现在复习到了HTML基础知识,本打算用VS敲想了想还是用了XMind(真的好用!!!)文件 ...
- vue +iview Select省市区联动
因为需要保存的表里只有City_id一个字段,所以这边只保存"区"的值 <Row type="flex" justify="start" ...