本蒟蒻共450分(100+70+100+70+100+10)
A题 [202504A]小信买玩具
题目传送门
点开A题,这题之前好像做过,(100-n%100)%100两次取模即可
核心代码
cin >> n;
cout << (100 - n % 100) % 100;
B题 [202504B]平方质和数
题目传送门
进入B题,这不是判断数位和是否为质数嘛,赛后才发现是判断数位和是否为质数的函数错了QWQ。。。没开ll
核心代码
bool jugde(ll a) {
if (a <= 1) return 0;
for (ll i = 2; i <= sqrt(a); i++)
if (a % i == 0) return 0;
return 1;
}
bool check(ll a) {
ll sum = 0;
while (a) {
sum += a % 10;
a /= 10;
}
return jugde(sum);
}
int main() {
for (ll i = max((int)(pow(l, 0.5) - 1), 4); i * i <= r; i++) {
if (i * i >= l && i * i <= r) {
if (check(i * i)) {
flag = 1, ans *= (i * i) % 998244353, ans %= 998244353;
}
}
}
}
C题 [202504C] 好区间
题目传送门
C题就是区间前缀和,很简单
核心代码
cin >> n >> l >> k;
for (ll i = 1; i <= n; i++) {
cin >> a[i];
a[i] += a[i - 1];
}
for (ll i = l; i <= n; i++) {
if (a[i] - a[i - l] <= k) {
ans++;
}
}
cout << ans;
D题 [202504D]守护空间站
题目传送门
D题数据范围很大,暴力70分不知道怎么优化,赛后看题解知道只需要看最高位即可
核心代码
cin >> t;
while (t--) {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
ans = 0;
for (ll j = 29; j >= 0; j--) {
ll cnt = 0;
for (ll z = 0; z <= n; z++) {
if (a[z] >= (1 << j) && a[z] < (1 << (j + 1))) {
cnt++;
}
}
ans += cnt * (cnt - 1) / 2;
}
cout << ans << '\n';
}
E题 [202504E] 牛马分配
题目传送门
E题找出A,B的最大值即可,再判断最大值的坐标即可
核心代码
freopen("202504E.in", "r", stdin);
freopen("202504E.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> b[i].x;
a[i].i = i, b[i].i = i;
}
sort(a + 1, a + n + 1, cmp);
sort(b + 1, b + n + 1, cmp);
if (a[1].i != b[1].i) {
cout << max(a[1].x, b[1].x);
} else {
cout << min(a[1].x + b[1].x, max(max(a[2].x, b[1].x), max(a[1].x, b[2].x)));
}
F题 [202504F]小信的元素移动
题目传送门
F题不知道while的结束条件,全部输出-1,10分
核心代码
cin >> t;
while (t--) {
cin >> n >> k;
vector<int> a(n + 1);
priority_queue<PII, vector<PII>, greater<PII>> h;
for (int i = 0; i < n; ++i) {
cin >> a[i];
if (!a[i]) h.push({0, i});
}
int ans = 0;
while (!h.empty()) {
auto now = h.top();
h.pop();
int cur = (now.second + k) % n;
if (a[cur] == 0) continue;
a[cur] = 0;
h.push({now.first + 1, cur});
ans = max(ans, now.first + 1);
}
bool flag = true;
for (int i = 0; i < n; ++i) {
if (a[i]) {
flag = false;
break;
}
}
if (flag) {
cout << ans << endl;
} else cout << -1 << endl;
}