1001. 2020
注意 "
的输出和不要忽略 ;
。
cout << "SET date=\"7/23/2021\";" << endl;
或 printf("SET date=\"7/23/2021\";")
。
1002. 水滴 💧
按照题目计算即可。
double a = 3.6, b = 2.81, g = 9.8;
double r, gamma, rho;
cin >> r >> gamma >> rho;
printf("%.2f\n", r * r * r * pow(a * gamma/rho/g/r/r, 3/b));
1003. 再次相遇
模拟题,根据题目进行模拟。
ans
表示总天数,N
表示今天需要扣除的思念值,now
表示今天在 N
思念值中的天数。
int x, N = 0, now = 0, ans = 0;
cin >> x;
while (x > 0) {
if (now == N) N++, now = 0;
x -= N;
now++;
if (x > 0) ans++;
}
cout << ans << endl;
1004. 达拉崩吧
(宽度优先搜索) 由于经过传送门传送不花费时间,自由活动花费 个单位时间,楼层传送器花费 个单位时间。因此使用简单的普通队列进行广搜,上述的转移过程会破坏队列的层次性,使得队头所到达的位置不一定是最早到达。
为了保证队列的分层性,可以考虑使用优先队列(priority_queue
)维护宽搜,使得队列按照到达时间分层。最后再判断不同类型的点,分别执行各自的宽搜操作。
1005. 秃头程序员
(二分答案) 可以想到,对第一天程序员所写的 bug 数目 进行二分,如果以当前 写出来的总 bug 数少于 ,则增大 ,否则减小 。
重点在于如何计算第一天写 个 bug 的情况下,写出总 bug 的数目。
暴力情况
一般的,我们可以直接使用暴力求解。
bool check(LL x) {
LL ans = 0;
for (int i = 1; x/i != 0; i++) {
ans += x/i;
}
return ans >= A;
}
优化情况
但是可以发现,本题的数据高达 。因此上述 check
函数极有可能超时,因此需要寻求优化方法。
整除分块
首先我们可以想到的是 里面,有很多项是重复的。
例如在 的情况下, 至 项分别是 。
而整除分块的任务就是 。
的性质:
- 不同的项最多只有 项。
- 与 相等的最大的 为 。
因此,我们可以尝试使用整除分块进行优化。
bool check(LL x) {
LL ans = 0;
for (LL l = 1, r; l <= x; l = r + 1) {
r = x/(x/l);
ans += (r - l + 1) * (x/l);
}
return ans >= A;
}
1006. 数列补全
(单调队列/线段树/树状数组/RMQ/...) 只要手动演算一下,就可以发现,只要把 从小到大依次取用即可(当然,也不难验证)。
问题在于对于当前需要填充的 取出了 ,如何查询 的值。
当前问题转换为在区间 的数列 中查询最大的 。只要复杂度在要求范围内能解决最大值查询的算法都欧可。
关于数列 的讨论
- 考虑当前需要填充 ,且已经选取了一个 ,即 。
- 考虑某次需要填充 ,且已经选取了一个 ,即 ,其中 由输入给定,而 为算法填充。
为满足题目要求的 ,应当使 尽可能大,即 (1.) 中 尽可能大,而索引 是不变的,则应当让区间 尽可能大,因此每次需要选取最小的 。
qpcz!恭喜港佬紫名!