一、题目报告
我没打(内心:完了^114514)
二、赛中状况
大家觉得我的赛中状况是什么?对啦!没有赛中状况(内心:慌得一匹)
三、解题报告
A:Adjacent Product
题目大意
给定一个长度为的数组,计算每相邻的俩个元素的乘积并输出。
题目解析
线性遍历,输出答案。
AC代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
// #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define bug printf("--------\n");
#define enter printf("\n");
#define debug(x) cout << #x << '=' << x << endl;
#define file(FILENAME) \
freopen(FILENAME ".in", "r", stdin), freopen(FILENAME ".out", "w", stdout)
#define rep(i, a, b) for (int(i) = (a); (i) <= (b); ++(i))
#define inv(x, mod) ppow((x), (mod)-2)
#define mem(t, v) memset((t), (v), sizeof(t));
#define DBG cerr << __LINE__ << ' ' << __FUNCTION__ << endl;
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define N 100005
#define M 100005
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 1000000009
int main() {
// file("");
CLOSE;
ll n;
ll a[105];
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n - 1; i++) cout << a[i] * a[i + 1] << ' ';
return 0;
}
B:Piano
题目大意
给定一个由无限重复的字符串 wbwbwwbwbwbw
形成的字符串,判断是否有一段子串包含 个 w
和 个 b
。
题目解析
原定小字符串是由7个w和5个b组成的,可以减去这其中包含的。在从无限的字符串中搜索有没有一段字串满足处理后的字符串。
AC代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
// #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define bug printf("--------\n");
#define enter printf("\n");
#define debug(x) cout << #x << '=' << x << endl;
#define file(FILENAME) \
freopen(FILENAME ".in", "r", stdin), freopen(FILENAME ".out", "w", stdout)
#define rep(i, a, b) for (int(i) = (a); (i) <= (b); ++(i))
#define inv(x, mod) ppow((x), (mod)-2)
#define mem(t, v) memset((t), (v), sizeof(t));
#define DBG cerr << __LINE__ << ' ' << __FUNCTION__ << endl;
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define N 100005
#define M 100005
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 1000000009
map<pair<ll, ll>, ll> mp;
int main() {
// file("");
CLOSE;
ll n, m;
cin >> n >> m;
ll aa = min(n / 7, m / 5);
n = n - aa * 7;
m = m - aa * 5;
string s = "wbwbwwbwbwbwwbwbwwbwbwbwwbwbwwbwbwbw";
ll w = 0, b = 0;
for (int i = 0; i < 36; i++) {
if(s[i]=='w')w++;
else b++;
if(mp[{w-n,b-m}]==1){cout<<"Yes";return 0;}
mp[{w,b}]=1;
}
cout<<"No";
return 0;
}
C:Σ
题目大意
给定一个序列和一个区间,求这个区间里没有从这个序列中出现的数的和。
题目解析
等差数列求出这个区间的所有和,再用set(能去重的就行)处理一下序列求出序列中数字的和,做差即可。
AC代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
// #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define bug printf("--------\n");
#define enter printf("\n");
#define debug(x) cout << #x << '=' << x << endl;
#define file(FILENAME) \
freopen(FILENAME ".in", "r", stdin), freopen(FILENAME ".out", "w", stdout)
#define rep(i, a, b) for (int(i) = (a); (i) <= (b); ++(i))
#define inv(x, mod) ppow((x), (mod)-2)
#define mem(t, v) memset((t), (v), sizeof(t));
#define DBG cerr << __LINE__ << ' ' << __FUNCTION__ << endl;
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define N 100005
#define M 100005
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 1000000009
set<ll> st;
int main() {
// file("");
CLOSE;
ll n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
ll x;
cin >> x;
st.insert(x);
}
ll anss = 0;
for (ll u : st) {
if (u <= k) anss += u;
else break;
}
ll ans = (1 + k) * k / 2 - anss;
cout << ans;
return 0;
}
D:Gomamayo Sequence
题目大意
有一个01串,要求将这个01串改为仅有一组相邻数字相等的01串,问最小花费金额是多少。
题目解析
动态规划!启动!很明显本题是个dp,可以推导上一位的数字与是否有相邻数字出现来解决本题。
AC代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
// #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define bug printf("--------\n");
#define enter printf("\n");
#define debug(x) cout << #x << '=' << x << endl;
#define file(FILENAME) \
freopen(FILENAME ".in", "r", stdin), freopen(FILENAME ".out", "w", stdout)
#define rep(i, a, b) for (int(i) = (a); (i) <= (b); ++(i))
#define inv(x, mod) ppow((x), (mod)-2)
#define mem(t, v) memset((t), (v), sizeof(t));
#define DBG cerr << __LINE__ << ' ' << __FUNCTION__ << endl;
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define N 200005
#define M 100005
#define inf 0x3f3f3f3f3f3f3f3f
#define mod 1000000009
ll n;
string s;
ll a[N];
ll dp[N][2][2];
int main() {
// file("");
CLOSE;
cin >> n;
cin >> s;
s = ' ' + s;
for (int i = 1; i <= n; i++) cin >> a[i];
dp[2][0][0] = (s[1] == '0') * a[1] + (s[2] == '1') * a[2];
dp[2][1][0] = (s[1] == '1') * a[1] + (s[2] == '0') * a[2];
dp[2][0][1] = (s[1] == '1') * a[1] + (s[2] == '1') * a[2];
dp[2][1][1] = (s[1] == '0') * a[1] + (s[2] == '0') * a[2];
for (int i = 3; i <= n; i++) {
dp[i][0][0] = dp[i - 1][1][0] + (s[i] == '1') * a[i];
dp[i][1][0] = dp[i - 1][0][0] + (s[i] == '0') * a[i];
dp[i][0][1] = min(dp[i - 1][1][1], dp[i - 1][0][0]) + (s[i] == '1') * a[i];
dp[i][1][1] = min(dp[i - 1][0][1], dp[i - 1][1][0]) + (s[i] == '0') * a[i];
}
cout << min(dp[n][0][1], dp[n][1][1]);
return 0;
}