A - aaaadaa (abc384 A)
题目大意
给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。
解题思路
一个循环判断一下就行了。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{int n;char a, b;cin >> n >> a >> b;string s;cin >> s;for (int i = 0; i < n; i++){if (s[i] != a) s[i] = b;}cout << s;return 0;
}
B - ARC Division (abc384 B)
题目大意
有两种比赛,div1在1600-2799的范围内计算入rating,div2在1200-2399的范围内计算入rating,给定n场比赛,告诉你每场比赛是div几,并且给定这场比赛后变化的分数,如果当前分数在计入rating的范围内,就会产生这个变化,否则什么都不会发生,求最后的rating
解题思路
按照题意模拟即可。
代码
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int main()
{int n, r;cin >> n >> r;while (n--) {int d, a;cin >> d >> a;if (d == 1 && r >= 1600 && r <= 2799) r += a;else if (d == 2 && r >= 1200 && r <= 2399) r += a;}cout << r;return 0;
}
C - Perfect Standings (abc384 C)
题目大意
给定五道题的分数,一共有31个人,他们分别做出了A,B,C,D,E,AB,AC,AD...ABCDE,总之就是每个人都做出题了,并且每个人做出的题目序列都不一样,请你把这31个人的分数排序,如果分数相同,按字母小的靠前。
解题思路
01穷举,统计一下分数就行。
代码
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int main()
{int c[10];rep(i, 5) cin >> c[i];pair<int, string> a[50];int k = 0;for (int i = 0;i < (1 << 5);i++) {string t = "";int p = 0;for (int j = 0;j < 5;j++) {if (i & (1 << j)) {t += char('A' + j);//当前人做出的题目字符串p += c[j];}}a[k++] = { -1 * p,t };//按分数从大到小,字符串字母序从小到大}sort(a, a + k);rep(i, k) cout << a[i].second << endl;return 0;
}
D - Repeated Sequence (abc384 D)
题目大意
给定一个数组,由这个数组不断循环可以得到一个无限长的数组,问这个数组当中有没有连续一段的和为S。
解题思路
一段连续串是由一段后缀,几段数组重复,一段前缀三个部分构成,那么我们把所有的后缀和放进一个set里,然后从前往后循环,用s减去前缀和,模数组总和,看剩下的是否在后缀和里出现过即可。
代码
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
int n;
ll s;
ll a[200005];
int main()
{cin >> n >> s;ll sum = 0;set <ll> ss;rep(i, n) {cin >> a[i];sum += a[i];ss.insert(sum);}ss.insert(0);ll t = 0;for (int i = n - 1;i >= 0;i--) {if (ss.count((s - t) % sum)) {cout << "Yes";return 0;}t += a[i];}if (ss.count((s - t) % sum)) {cout << "Yes";return 0;}cout << "No";return 0;
}
E - Takahashi is Slime 2 (abc384 E)
题目大意
给定一个二维平面地图,每个位置都是一个史莱姆,每个史莱姆都有一个数值。
takahashi一开始在P,Q的位置,他可以吞并附近的,小于他当前数值1/X的史莱姆,并把它的数值加到自己头上,问他最后最大数值能到多少。
解题思路
很好的优先队列题,用优先队列进行BFS,按照数值排序,每次看队头能不能吞并,如果能吞并就吞,并且把这个吞并的史莱姆的新的邻近格压进队列。
代码
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(v) v.begin(),v.end()
#define vi vector<int>
#define ll long long
using namespace std;
ll a[505][505];
bool vis[505][505];
const int dx[4] = { 1, 0, -1, 0 };
const int dy[4] = { 0, 1, 0, -1 };
ll k;
bool sless(ll x, ll y) {if (x % k == 0) return y < (x / k);else return y <= (x / k);
}
int main()
{int h, w;cin >> h >> w >> k;int x, y;cin >> x >> y;x--;y--;int sx = x, sy = y;priority_queue<pair<ll, pair<int, int> >, vector<pair<ll, pair<int, int> > >, greater<pair<ll, pair<int, int> > >> q;rep(i, h) rep(j, w) {cin >> a[i][j];}ll ans = 0;q.push({ ans,{ x, y } });vis[x][y] = 1;while (!q.empty()) {x = q.top().second.first;y = q.top().second.second;ll t = q.top().first;q.pop();if ((x == sx && y == sy) || sless(ans, a[x][y])) {// cout << ans << " " << t << " " << x << " " << y << endl;ans += a[x][y];rep(i, 4) {int nx = x + dx[i];int ny = y + dy[i];if (nx < 0 || nx >= h || ny < 0 || ny >= w || vis[nx][ny]) continue;vis[nx][ny] = 1;q.push({ a[nx][ny],{ nx,ny } });}}}cout << ans << endl;return 0;
}