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;
}
标签:AtCoder,int,ll,Solution,long,cin,384,rep,define
From: https://www.cnblogs.com/NightRaven/p/18608072