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 的数字,可以在数字间插入若干个加号。求所有插入情况的计算式之和。
分析:
深搜找到所有情况,然后暴力求就完事了。感觉用 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;
}