Loading

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;
}


比赛链接 https://atcoder.jp/contests/abc379

posted @ 2024-11-09 23:39  _SeiI  阅读(117)  评论(0编辑  收藏  举报