AtCoder Beginner Contest 379
A - Cyclic
题意
输入\(3\)个连续字符\(a,b,c\),输出另外两种顺序。
思路
模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
char a, b, c;
cin >> a >> b >> c;
cout << b << c << a << endl;
cout << c << a << b << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Strawberries
题意
给定长度为\(n\)的串\(s\)(只包含\(O,X\)),和\(k\)。每次可以消耗连续个\(O\)来使答案加\(1\)。求答案。
思路
模拟。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n, k, ans = 0, cnt = 0;
string s;
cin >> n >> k >> s;
for (int i = 0; i < n; i++)
{
if (s[i] == 'X')
{
cnt = 0;
}
else
{
cnt++;
}
if (cnt == k)
{
ans++;
cnt = 0;
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Sowing Stones
题意
\(n\)个格子,有\(m\)个格子有石头。接下来的\(2\)行每行\(m\)个数据,分别代表石头的位置及数量。每次能将一个石头前移一格(但不能越界)。求使得每个格子恰有一个石头的最小操作数,不可能则输出\(-1\)。
思路
假设开始所有石头都在第\(1\)格,则需要操作\(\frac {n \ (n + 1)} 2\)(等差数列求和)。刨去石头总数多/少了的情况,对于有石头的一格\(i\),它可以少操\(x[i] × a[i]\)次。
注意:输入不一定是有序的,就是这个让我打出了集训以来最不是人的操作
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n, m, sum = 0;
cin >> n >> m;
vector<pii> v(m + 1);
for (int i = 1; i <= m; i++)
{
cin >> v[i].first;
}
for (int i = 1; i <= m; i++)
{
cin >> v[i].second;
sum += v[i].second;
}
if (sum > n)
{
cout << -1 << endl;
return;
}
sort(v.begin(), v.end());
int ans = n * (n + 1) / 2, now = 0;
for (int i = 1; i <= m; i++)
{
if (now < v[i].first - 1)
{
cout << -1 << endl;
return;
}
now += v[i].second;
ans -= v[i].first * v[i].second;
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Home Garden
题意
\(10^{100}\)个花盆,\(q\)次操作,每次操作分\(3\)种:
\(1\):拿个空花盆种一颗植物,初始高度为\(0\);
\(2\ t\):等\(t\)天,现有植物长高\(t\)。
\(3\ h\):输出高度\(h\)及以上的植物的数量,并将这些植物移出花盆。
思路
由于植物的生长速度一致,所以收获的一定是先种下的植物,用队列来存各个植物种下的时间即可。
代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
int tim = 0;
queue<int> q;
void solve()
{
int cmd;
cin >> cmd;
switch (cmd)
{
case 1:
q.push(tim);
break;
case 2:
int t;
cin >> t;
tim += t;
break;
case 3:
{
int h, ans = 0;
cin >> h;
while (q.size() && tim - q.front() >= h)
{
ans++;
q.pop();
}
cout << ans << endl;
}
break;
default:
break;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
E - Sum of All Substrings
题意
给定长度为\(n\)的数字字符串\(s\),定义函数\(f(i,j)\)为\(s\)的第\(i\)位到第\(j\)位形成的数字(如\(s=123\ ,\ f(2,3)=23\))。求:
思路
对于样例:
\(f(1,1)+f(1,2)+f(1,3)+f(2,2)+f(2,3)+f(3,3)\)
\(=(s[1]) + (10s[1]+s[2]) + (100s[1]+10s[2]+s[3]) + (10s[2] + s[3]) + (s[3])\)
\(=10^2s[1] + 10^1(s[1]+2s[2]) + 10^0*(s[1]+2s[2]+3s[3])\)
\(=\sum_{i=1}^n 10^{n-i} \sum_{j=1}^i j × s[j]\)
代码
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n;
cin >> n;
string s, ans;
cin >> s;
vector<int> a(n);
for (int j = 0; j < n; j++)
{
a[j] = (j + 1) * (s[j] - '0');
}
for (int i = 1; i < n; i++)
{
a[i] += a[i - 1];
}
int c = 0;
for (int i = 0; i < n; i++)
{
c += a[n - 1 - i];
ans.push_back('0' + c % 10);
c /= 10;
}
while (c)
{
ans.push_back('0' + c % 10);
c /= 10;
}
reverse(ans.begin(), ans.end());
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
//cin >> T;
while (T--)
{
solve();
}
return 0;
}