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 -
题意
思路
代码
点击查看代码
F -
题意
思路
代码
点击查看代码
G -
题意
思路
代码
点击查看代码