2025蓝桥杯C++国赛A组题目解析
蓝桥杯这次表现不佳,决定认真复盘一下未完成的题目。
目录- C. 土地平整方案
- 题目描述
- 思路分析
- D. 生日同星期问题
- 题目描述
- 思路分析
- E. 树形结构
- F. 连锁影响
C. 土地平整方案
题目描述
给定一个数组a。如果某个位置a_i左侧所有元素都与其不同,可以将左侧全部元素修改为a_i,消耗代价为a_i;对右侧同理操作。此外,如果存在a_i = a_j,且它们之间的所有元素都与该值不同,可以将中间区间全部改为a_i,消耗同样为a_i。每个位置至多被修改一次。求使整个数组变为相同元素的最小代价。
思路分析
由于每个位置只能修改一次,修改方案实际上是唯一的:选取数组中已存在的某个值作为目标,整个数组中所有与该值不相等的连续段数量乘以该值即为对应答案。
#include <bits/stdc++.h>
#define int long long
constexpr int MAXV = 1000005;
constexpr int INFW = (int)2e16;
int n, arr[MAXV], freq[MAXV];
bool exist[MAXV];
void solve() {
std::cin >> n;
int val, uniq = 0;
for (int i = 1; i <= n; i++) {
std::cin >> val;
if (val != arr[uniq]) arr[++uniq] = val;
}
if (uniq == 1) {
std::cout << "0\n";
return;
}
for (int i = 1; i <= uniq; i++) {
freq[arr[i]]++;
exist[arr[i]] = true;
}
freq[arr[1]]--;
freq[arr[uniq]]--;
int result = INFW;
for (int i = 1; i <= (int)1e6; i++) {
if (!exist[i]) continue;
result = std::min(result, i * (freq[i] + 1));
}
std::cout << result << "\n";
}
D. 生日同星期问题
题目描述
已知两个人的生日分别为m1月d1日和m2月d2日。从2025年开始,连续k年内,找出哪些年份这两人落在同一星期几。
思路分析
k的范围仅为50,直接模拟即可。首先将2月29日转换为2月28日并记录标记:若是闰年,则将该人员生日延后一天处理,处理完后立即恢复。接着将生日划分为1月1日至2月28日和3月1日至12月31日两部分分别计算,逐一判断即可。
#include <bits/stdc++.h>
#define int long long
constexpr int MAXV = 1000005;
constexpr int INFW = (int)2e16;
int k, m1, d1, m2, d2;
int cumDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeap(int year) {
return (year % 100 == 0) ? (year % 400 == 0) : (year % 4 == 0);
}
void solve() {
std::cin >> m1 >> d1 >> m2 >> d2 >> k;
for (int i = 2; i <= 12; i++) cumDays[i] += cumDays[i - 1];
int pos1 = cumDays[m1 - 1] + d1;
int pos2 = cumDays[m2 - 1] + d2;
int year = 2025;
bool tag1 = false, tag2 = false, found = false;
if (m1 == 2 && d1 == 29) pos1--, tag1 = true;
if (m2 == 2 && d2 == 29) pos2--, tag2 = true;
while (k--) {
bool leap = isLeap(year);
if (leap) {
if (m1 > 2) pos1++;
if (m2 > 2) pos2++;
pos1 += tag1;
pos2 += tag2;
}
if (std::abs(pos1 - pos2) % 7 == 0) {
std::cout << year << "\n";
found = true;
}
if (leap) {
if (m1 > 2) pos1--;
if (m2 > 2) pos2--;
pos1 -= tag1;
pos2 -= tag2;
}
year++;
}
if (!found) std::cout << "No Answer\n";
}
E. 树形结构
待补充
F. 连锁影响
待补充