AtCoder Beginner Contest 045 题解

目录

ABC 的 AB 感觉稍微水了一点,以后就懒得写题解惹 qvq

A - Trapezoids

int main (){
    IOS
    int a, b, h; cin >> a >> b >> h;
    cout << (a + b) * h / 2 << endl;
    return 0;
}

B - Card Game for Three (ABC Edit)

题目大意:

A、B、C 三个人, 每个人有若干张卡,有a、b、c 三种卡。每个人打完一张卡,就轮到对应字母的人接着打(可以是自己)。先打完所有牌的人获胜。

分析:

一开始以为是一个博弈题,没想到三个人都只能选择打牌堆顶的卡。(那 tm 不是没得选择吗)牌发到手上的时候,获胜的人就已经确定了,所以按题意模拟输出获胜者即可。

#include<bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f //2139062143
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Equ(a,b) (fabs((a)-(b))<eps)
#define More(a,b) (((a)-(b))>(eps))
#define x first
#define y second
using namespace std;
const int N=1e6+7;
const double eps=1e-6;
const int mod=1e9+7;
int a[N];
int main (){
    IOS
    map <char, int> mp;
    mp['a'] = 0, mp['b'] = 1, mp['c'] = 2;
    string mp2 = "ABC";
    string s[3]; cin >> s[0] >> s[1] >> s[2];
    int now = 0;
    while (s[now].size()){
        int temp = now;
        now = mp[s[temp].front()];
        s[temp].erase(0, 1);
    }
    cout << mp2[now] << endl;
    return 0;
}

C - Many Formulas

题目大意:

给出一个长度不超过 10 的数字,可以在数字间插入若干个加号。求所有插入情况的计算式之和。

AtCoder Beginner Contest 045 题解

分析:

深搜找到所有情况,然后暴力求就完事了。感觉用 python 可能会方便点。python 有个很好用的函数 eval。

#include<bits/stdc++.h>
#define int long long
#define INF 0x7f7f7f7f //2139062143
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Equ(a,b) (fabs((a)-(b))<eps)
#define More(a,b) (((a)-(b))>(eps))
#define x first
#define y second
using namespace std;
const int N=1e6+7;
const double eps=1e-6;
const int mod=1e9+7;
int a[N];
set <string> ans;
void dfs (string s){
    ans.insert (s);
    for (int i = 1 ; i < s.size () ; i ++){
        string temp = s;
        if (isdigit (s[i]) && isdigit (s[i - 1])){
            temp.insert(i, 1, '+');
            if (!ans.count(temp))
                dfs (temp);
        }
    }
}
int eval (string s){
    int res = 0, sum = 0; 
    for (int i = 0 ; i < s.size () ; i ++){
        if (isdigit(s[i])){
            res = res * 10 + (s[i] - '0');
        }
        else {
            sum += res;
            res = 0;
        }
    }
    sum += res;
    return sum;
}
signed main (){
    IOS
    string t; cin >> t;
    int sum = 0;
    dfs (t);
    for (auto i : ans){
        // cout << i << ' ' << eval (i) << endl;
        sum += eval (i);
    }
    cout << sum << endl;
    return 0;
}

D - Snuke's Coloring

题目大意:

给出一个部分格子被染成黑色的网格,问你恰好有 k 个格子被染成黑色的 \(3 \times 3\) 的网格有多少个。

分析 :

题目数据范围较大,\(1e9 \times 1e9\) 的网格存不下。但是被染色的点最多只有 \(1e5\) 个。每个点最多可以影响 9 个 \(3 \times 3\) 的网格,可以从这个方向入手解决。那么最多不会超过 9e5 个网格被染色,所以我们可以存下所有被染色的 \(3 \times 3\) 的网格计数求得。同时可以看出,全是空白的 \(3 \times 3\) 的网格是最多的。我们可以通过式子计算而来。详见代码。

#include<bits/stdc++.h>
#define int long long
#define INF 0x7f7f7f7f //2139062143
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Equ(a,b) (fabs((a)-(b))<eps)
#define More(a,b) (((a)-(b))>(eps))
#define x first
#define y second
using namespace std;
const int N=1e6+7;
const double eps=1e-6;
const int mod=1e9+7;
typedef pair<int, int> pii;
map <pii, int> cnt;
int h, w, n;
int ans[10];
void f (int u, int v){
    for (int i = max ((int)3, u) ; i <= min(u + 2, h) ; i ++){
        for (int j = max((int)3, v) ; j <= min (v + 2, w) ; j ++){
            cnt[{i, j}] ++;
        }
    }
}
signed main (){
    IOS
    cin >> h >> w >> n;
    while (n --){
        int u, v; cin >> u >> v;
        f(u, v);
    }
    int left = 0;
    for (auto i : cnt){
        ans[i.second]++;
        left ++;
    }
    cout << (h - 2) * (w - 2) - left << endl;
    for (int i = 1 ; i <= 9 ; i ++){
        cout << ans[i] << endl;
    }
    return 0;
}
上一篇:The Fun Of Algorithm - Day12 - 出售金鱼


下一篇:Java 面试题(四)