蓝桥杯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 << '
'; 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的, 先放着吧)

原文地址:https://www.cnblogs.com/2aptx4869/p/13831943.html