最近做的一些题目 Aug & Sep 2025
复建,感觉自己什么都不会。一些小逻辑题目,记录一下。
持续更新中!
The 2024 ICPC Asia EC Regionals Online Contest (II) L. 502 Bad Gateway
https://codeforces.com/gym/105358/problem/L
题目看不懂啊,总之就是
我们只有两种操作,一种是让时间自然流逝,一种是再随机一次时间。
显然,最优方案应该是一直随机时间,直到随机到的时间 \(x\) 满足 \(x \leq c\),从此不再随机时间。
这样的期望是 \(\frac{t-1}{2}+\frac{c}{2}\),用高考知识也就得出 \(c\) 的取值为 \(\sqrt{2T}\)。
other blog: https://blog.csdn.net/djhws144/article/details/142426613
#include <stdio.h>
#include <math.h>
#define ll long long
inline ll gcd (ll x, ll y) {
return x == 0 ? y : gcd(y % x, x);
}
inline void kagari () {
ll t; scanf("%lld", &t);
ll c = sqrt(2 * t), ans;
ll x = c * c - c + 2 * t, y = 2 * c;
c++;
ll xx = c * c - c + 2 * t, yy = 2 * c;
if (x * yy > xx * y) x = xx, y = yy;
ll gc = gcd(x, y);
x /= gc, y /= gc;
printf("%lld %lld\n", x, y);
return;
}
int main () {
int t; scanf("%d", &t);
while (t--) kagari();
return 0;
}
The 2024 ICPC Asia EC Regionals Online Contest (II) J. Stacking of Goods
https://codeforces.com/gym/105358/problem/J
主要是一个思想,类似于代数中的调整,放在以前肯定是很显然的,现在什么都不会了。
就是我们可以假设 现在我们只考虑最底下的两个物品。
设上方的总重量是 w,两个物品的重量和价值分别为 a1, c1, a2, c2。
1 号物品在上方时 这两个物品的体积为 \(w*c1+(w+a1)*c2\)
2 号物品在上方时 这两个物品的体积为 \(w*c2+(w+a2)*c1\)
比较这两个式子,也就是比较 \(a1*c2\) 与 \(a2*c1\)
所以我们只需要对每个物品进行排序,没必要按照 a/c 来进行排序,只要在 operator 函数内比较两个结构体就行了。这里也是一个代码技巧。
#include <stdio.h>
#include <algorithm>
#define ll long long
int n;
ll b[1000003], ans = 0, cnt = 0, w = 0;
struct NODE {
ll w, c;
bool operator < (const NODE &rhs) const {
return w * rhs.c == c * rhs.w ? w > rhs.w : w * rhs.c > c * rhs.w;
}
} a[1000003];
inline void kagari () {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%lld %lld %lld", &a[i].w, &b[i], &a[i].c), cnt += b[i];
std:: sort(a + 1, a + n + 1);
for (int i = 1; i <= n; ++i)
ans += w * a[i].c,
w += a[i].w;
ans = cnt - ans;
printf("%lld\n", ans);
return;
}
int main () {
kagari();
return 0;
}
P8778 [蓝桥杯 2022 省 A] 数的拆分
https://www.luogu.com.cn/problem/P8778
嗯,题目很有意思。只要看这个数字 n 能否用 \(a^2b^3\) 表示即可。
那怎么确定 a b 的值呢,枚举显然不行,1e18的数据开方是1e9 开立方是1e6。T是1e5,说明我们只剩 1000 的时间复杂度去处理这个 1e18 的数据。
不直接枚举 a b 的值,我们可以考虑将 n 质因数分解为形如 \(x^{x'}y^{y'}z^{z'}...\) 的形式。对任意一个 \(x^{x'}\):
- 如果 x' 为 1: 显然他是放不到任何一个 a 或 b 中的,无解;
- 如果 x' 为偶数: 它可以放到 a 中;
- 如果 x' 为大于 1 的奇数: 它可以拆分为 \(x^2x^{x'-2}\),同时放到 a 和 b 当中。
在枚举的同时我们进行 \(n -> n/x^{x'}\) 。这时可以发现,我们只需寻找在 n 中有没有一次方的质因数即可。
同时注意到,如此枚举质数的话,只需要枚举到 4000 就可以了,若此时 \(n\) 不为 1 我们直接检查其是否为平方数或立方数。因为 \(4000^5 > 10^{18}\) 。剩下来的 n 不可能是某个大于 4000 的数的 5、6、7、... 次方,只可能是某个数的 1、2、3、4(即2)次方。所以直接判断剩下的 n 是否为平方/立方数即可。
先留着不写代码!过几天再看一遍这道题!
但还是很难想啊,反正我不好想到,说简单又不简单的,只能注意到。反正我很难注意到,别人很容易注意到。
当然,蓝桥杯貌似是 OI 赛制。拿走部分分就可以了。
嗯,北京前 5%,貌似有一点点的难度。但 noip 的一等奖比率是不是也是 5%。
突然发现我目前还不是计算机专业,也不知道要不要转专业,嗯,难搞。

浙公网安备 33010602011771号