首页 > 其他分享 >AtCoder Beginner Contest 307 G Approximate Equalization

AtCoder Beginner Contest 307 G Approximate Equalization

时间:2023-06-26 15:24:53浏览次数:39  
标签:lfloor AtCoder typedef right Beginner Contest long rfloor

洛谷传送门

AtCoder 传送门

考虑我们如果确定了最终态 \(B = (B_1, B_2, ..., B_n)\),如何计算最少操作次数。

显然从左往右依次使 \(A_i = B_i\)。当操作到第 \(i\) 个位置时,此时 \(A'_i = \sum\limits_{j = 1}^i A_j - B_j\),所需操作次数为 \(|A'_i|\)。令 \(C_i = \sum\limits_{j = 1}^i A_j - B_j\),最少操作次数为 \(\sum\limits_{i = 1}^n |C_i|\)。

设 \(s = \sum\limits_{i = 1}^n A_i, r = s \bmod n\),那么最终态一定有 \(r\) 个 \(\left\lfloor\frac{s}{n}\right\rfloor + 1\),\(n - r\) 个 \(\left\lfloor\frac{s}{n}\right\rfloor\)。考虑 dp,设 \(f_{i, j}\) 为考虑到第 \(i\) 个位置,当前有 \(j\) 个 \(\left\lfloor\frac{s}{n}\right\rfloor + 1\)。转移讨论第 \(i\) 个位置取 \(\left\lfloor\frac{s}{n}\right\rfloor\) 还是 \(\left\lfloor\frac{s}{n}\right\rfloor + 1\) 即可。因为知道 \(j\),所以 \(C_i\) 能算出来,操作次数也能知道。

时间复杂度 \(O(n^2)\)。

code
// Problem: G - Approximate Equalization
// Contest: AtCoder - Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 307)
// URL: https://atcoder.jp/contests/abc307/tasks/abc307_g
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 5050;

ll n, a[maxn], f[maxn][maxn], b[maxn];

void solve() {
	scanf("%lld", &n);
	ll s = 0;
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		s += a[i];
	}
	ll r = (s % n + n) % n;
	s = (s - r) / n;
	for (int i = 1; i <= n; ++i) {
		b[i] = b[i - 1] + a[i] - s;
	}
	mems(f, 0x3f);
	f[0][0] = 0;
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j <= i; ++j) {
			f[i][j] = f[i - 1][j];
			if (j) {
				f[i][j] = min(f[i][j], f[i - 1][j - 1]);
			}
			f[i][j] += abs(b[i] - j);
		}
	}
	printf("%lld\n", f[n][r]);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:lfloor,AtCoder,typedef,right,Beginner,Contest,long,rfloor
From: https://www.cnblogs.com/zltzlt-blog/p/17505682.html

相关文章

  • AtCoder Beginner Contest 245 Ex Product Modulo 2
    洛谷传送门AtCoder传送门很好的题。下文令\(k\)为原题面中的\(n\),\(n\)为原题面中的\(k\),\(m\)为原题面中的\(m\)。从一些简单的情况入手。1.\(m\)为质数\(k=0\)的情况是平凡的,只需要要求\(\existsi\in[1,n],a_i=0\)即可。总方案数减去不合法方案数,......
  • AtCoder Beginner Contest 307 ABCDE
    AtCoderBeginnerContest307A-WeeklyRecordsProblemStatement题意:告诉你有几个礼拜,问你每个礼拜走的路程和。Solution思路:按题意模拟,每7天加起来就行。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ intn; cin>>n; llsum=......
  • AtCoder Beginner Contest 267 ABCDE
    AtCoderBeginnerContest267A-SaturdayProblemStatement题意:问你给定的天到礼拜六还要几天。思路:直接算。#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings; cin>>s; if(s=="Monday")cout<<6-1<<endl; elseif(s=="Tues......
  • AtCoder Beginner Contest 252 Ex K-th beautiful Necklace
    洛谷传送门AtCoder传送门不知道为什么可以想到设\(n_c\)为颜色\(c\)的出现次数,那么\(\prodn_c\)也即选的方案数\(\approx1.25\times10^{11}\)。发现\(B=\sqrt{\prodn_c}\)不大,考虑meet-in-the-middle,把所有颜色分成两部分,每一部分的\(\prodn_c\)都接近\(......
  • AtCoder Beginner Contest 212(E,F)
    AtCoderBeginnerContest212(E,F)E(dp)E题目大意为有\(n\)个点,我们需要找到\(k+1\)个点,用数组\(A\)表示,其中,\(A_i\)和\(A_{i+1}\)也不能一模一样,而且,规定\(A_0\)是\(1\),并且\(A_k\)也是\(1\),而且,还要满足下面的\(m\)种条边是不可以代表为\(A_i\)和\(A_{i+1}\),问我们可以......
  • SMU Spring 2023 Contest Round 6
    E.ExpenditureReduction从左右往右找到包含B字符的最近位置,然后从这个位置有从右到左找回去找到包含完所有B字符的位置,这个区间就是答案#include<bits/stdc++.h>#defineinf0x3f3f3f3f#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=......
  • AtCoder Beginner Contest(abc) 299
    A-TreasureChest题目大意给定一个由'|''*'和'.'组成的字符串,并且保证一定有1个'*'和2个'|',检查'*'是否在两个'|'之间;解题思路签到题不多嗦了;但是这里可以注意一下string的find函数;find(charc,intpos)意为从第pos个字符开始找字符c,返回值......
  • AtCoder Regular Contest 154 C Roller
    洛谷传送门AtCoder传送门被这题干爆了考虑把环压缩成块。这样一次操作就是,选择两个相邻的块,把左边块长度减\(1\),右边块长度加\(1\)。特判\(a,b\)所有块长都是\(1\)的情况,这种情况不能操作。排除掉上面的情况,我们断言:有解的充要条件是,存在某一种\(a\)的顺序,使得\(b......
  • 【题解】AtCoder-ABC306G Return to 1
    这也太强了!容易想到的是用若干环拼出这个\(10^{10^{100}}\),也就是这些环的\(\gcd\mid10\)。之后就不会了。先正图反图两次DFS,只留下\(1\)所在强连通分量里的边,对正图跑DFS生成树,定义其深度从\(0\)开始,然后有一个结论是:对于任何正整数\(a\),图中存在一个包含\(1\)......
  • AtCoder Beginner Contest 229(F,G)
    AtCoderBeginnerContest229(F,G)F(二部图,dp)F这个题大致是给你\(n+1\)个点,为\(0\)到\(n\),然后\(n\)条边是点\(0\)到\(1...n\)这些点的\(n\)条边,后面还有\(n\)条边,连接点\(i\)和\(i+1\)(其中\(i\)为\(1\)到\(n\),其中\(n\)是和\(1\)连接的)前\(n\)条边的价值是\(a_i\),后......