Atcoder Regular Contest 059 题解

ARC059C. Be Together *712

签到题。枚举要改成哪个,因为值域只有 \([-100,100]\)。然后对总代价取个 \(\min\) 即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN = 105;
LL n, A[MAXN];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n;
	for(LL i = 1; i <= n; i ++) cin >> A[i];
	LL ans = 1e18;
	for(LL i = -100; i <= 100; i ++)
	{
		LL anss = 0;
		for(LL j = 1; j <= n; j ++)
			anss += (A[j] - i) * (A[j] - i);
		ans = min(ans, anss);
	}
	cout << ans << '\n';
	return 0;
}

ARC059D. Unbalanced *1374

小清新结论题,考虑怎样构造这个串。其重要条件就是两个相同的字母的位置的绝对值相差为 \(1\)\(2\),然后判一下就做完了。思维难度主要在这个结论。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	string s;
	cin >> s;
	for(int i = 1; i < (int)s.length(); i ++)
	{
		if(i >= 2) 
		{
			if(s[i] == s[i - 2])
			{
				cout << i - 1 << " " << i + 1 << '\n';
				return 0;
			}
		}
		if(s[i] == s[i - 1])
		{
			cout << i << " " << i + 1 << '\n';
			return 0;
		}
	}
	cout << -1 << " " << -1 << '\n';
	return 0;
}

ARC059E. Children and Candies *2189

算贡献的题,又看起来是一个背包。所以我们考虑在背包的基础上做一做手脚。

定义 \(f_{i,j}\) 为考虑到第 \(i\) 个,选了 \(j\) 个糖果的价值总和。由于乘法具有分配率,所以

\[f_{i,j}=f_{i-1,j-k}\times \sum^{b_i}_{t=a_i} t^k \]

答案就是 \(f_{n,c}\),这样是 \(O(n^3)\) 的。然后注意到那个和式可以 \(O(n^2)\) 与处理掉做前缀和优化,于是总体复杂度降为 \(O(n^2)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN = 405;
const LL MOD = 1e9 + 7;
LL n, c, A[MAXN], B[MAXN], Pw[MAXN][MAXN], SumPw[MAXN][MAXN], DP[MAXN][MAXN];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> c;
	for(LL i = 1; i <= n; i ++) cin >> A[i];
	for(LL i = 1; i <= n; i ++) cin >> B[i];
	for(LL i = 1; i < MAXN; i ++)
	{
		Pw[i][0] = 1ll;
		for(LL j = 1; j < MAXN; j ++)
			Pw[i][j] = (Pw[i][j - 1] * i) % MOD;
	}
	for(LL i = 1; i < MAXN; i ++)
		for(LL j = 0; j < MAXN; j ++)
			SumPw[i][j] = (SumPw[i - 1][j] + Pw[i][j]) % MOD;
	DP[0][0] = 1;
	for(LL i = 1; i <= n; i ++)
		for(LL j = 0; j <= c; j ++)
			for(LL k = 0; k <= j; k ++)
				DP[i][j] = (DP[i][j] + (DP[i - 1][j - k] * (SumPw[B[i]][k] - SumPw[A[i] - 1][k] + MOD)) % MOD) % MOD;
	cout << DP[n][c] << '\n';
	return 0;
}

ARC059F. Unhappy Hacking *2427

咕咕咕

posted @ 2024-11-20 20:39  Fractured_Angel  阅读(1)  评论(0编辑  收藏  举报