藍橋杯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的, 先放着吧)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM