AT_abc346补题报告

一、题目报告

        我没打(内心:完了^114514)

二、赛中状况

        大家觉得我的赛中状况是什么?对啦!没有赛中状况(内心:慌得一匹)

三、解题报告

A:Adjacent Product

题目大意

        给定一个长度为n的数组,计算每相邻的俩个元素的乘积并输出。

题目解析

        线性遍历,输出答案。

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 个 w 和B 个 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;
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值