蓝桥杯2020 A组
A
数门牌, 找2就完了 624
int main() {
IOS;
rep (i, 1, 2020) {
int cur = i;
while (cur) n += (cur % 10 == 2), cur /= 10;
}
cout << n;
return 0;
}
B
暴力__gcd完事, 记得 1/1, 2481215
int main() {
IOS;
rep (i, 1, 2020) {
rep (j, i + 1, 2020) n += (__gcd(i, j) == 1);
}
cout << (n << 1) + 1;
return 0;
}
C
暴力跑就完了, 一会↗, 一会↙, 走到 x == 1 或者 y== 1拐弯就行, 761
int main() { //761
IOS; bool f = 1;
for (int x = 1, y = 1, k = 1; ; ++k) {
if (x == 20 && y == 20) { cout << k; break; }
if (f)
if (x - 1) --x, ++y;
else ++y, f = 0;
else
if (y - 1) ++x, --y;
else ++x, f = 1;
}
return 0;
}
D
暴力跑, 状压就行, 80(跑出81, 是算了 0, 题目要求最少亮一根)
int main() { //80;
IOS;
rep (i, 1, (1 << 7) - 1) {
rep (j, 1, 7) v[j] = 0, f[j] = j;
rep (j, 0, 6) if (i >> j & 1) v[j + 1] = 1;
rep (j, 1, 6) if (v[j] && v[j + 1]) unit(j, j + 1);
if (v[1] && v[6]) unit(1, 6);
if (v[7]) {
if (v[2]) unit(2, 7);
if (v[3]) unit(3, 7);
if (v[5]) unit(5, 7);
if (v[6]) unit(6, 7);
}
bool f = 1;
rep (j, 1, 7) rep (k, j + 1, 7) if (v[j] && v[k] && find(j) != find(k)) f = 0;
n += f;
}
cout << n;
return 0;
}
E
(这道题不确定)
线和圆其实是一样的, 单考虑纯线(圆)
肯定是 第i个线(原) 和前(i - 1)个线(原) 两两(重点,两两)相交
故 每次多分出 i 个面,
然后合并 圆和线, 肯定是 包住 线交差为出围出来的区域, 然后和每条直线都相交 一个圆和20条线 多形成 40个区域
所以答案是 1011
int main() {
IOS; ll ans = 1; //最初就是一个面
rep (i, 1, 20) ans += i;
cout << ans + 20 * 40;
return 0;
}
F
sb题
int main() {
IOS;
ll sum = 0, mx = -1, mi = 120;
for (cin >> _; _; --_) cin >> n, sum += n, umin(mi, n), umax(mx, n);
cout << mx << ' ' << mi << ' ' << setiosflags(ios::fixed) << setprecision(2) << sum * 1.0 / n;
return 0;
}
G
这道题 ABCDDCBA 你可以直接枚举年分, 我是枚举的 ABCD, 最重要的是判断日期是否合法
int yue[] = {1, 3, 5, 7, 8, 10, 12};
bool check(int yy, int mm, int dd) {
if (mm > 12) return 0;
bool f = 0; //判断闰年
if (yy % 100 && yy % 4 == 0) f = 1;
else if (yy % 400 == 0) f = 1;
if (mm == 2) return dd <= 28 + f;
rep (i, 0, 6) if (mm == yue[i]) return dd <= 31;
return dd <= 30;
}
int main() {
IOS; cin >> n; m = 1e9;
rep (i, 1, 9)
rep (j, 0, 9)
rep (p, 0, 9)
rep (q, 0, 9) {
int mm = q * 10 + p, dd = j * 10 + i;
int yy = i * 1000 + j * 100 + p * 10 + q;
if (!check(yy, mm, dd)) continue;
int cur = yy * 10000 + mm * 100 + dd;
if (cur <= n) continue;
umin(m, cur);
}
cout << m << '\n'; m = 1e9;
rep (i, 1, 9)
rep (j, 0, 9) {
int mm = j * 10 + i, dd = mm;
int yy = i * 1010 + j * 101;
if (!check(yy, mm, dd)) continue;
int cur = yy * 10000 + mm * 100 + dd;
if (cur <= n) continue;
umin(m, cur);
}
cout << m;
return 0;
}
H
和南京2018icpc的 j 很像
用 map<char, ll> st 存上一次 char 出现的位置
map<char, ll> ls 存上上一次 ls 出现的位置
默认所有 char 第一次出现在 i == 0(字符串下标从1开始)
然后 O(n) 扫就好了, 总的复杂度用了 map 乘个 log
sb蓝桥不让用unordered, 不然就是个常数
unordered_map<char, ll> st, ls;
char s[N];
int main() {
IOS; cin >> s + 1;
int len = strlen(s + 1);
ll ans = 0;
for (int i = 1; s[i]; ++i) {
int qq = st[s[i]];
if (qq) ans -= (qq - ls[s[i]]) * (len - i + 1);
ans += (i - qq) * (len - i + 1);
ls[s[i]] = qq; st[s[i]] = i;
}
cout << ans;
return 0;
}
I
爬爬爬爬, 计算机和, 还是椭圆, 推公式都要半天, 直接放弃, 平面几何不带板子直接过
J
(博客写着写着发现写错了.........., 只能处理长度<27的, 先放着吧)