首页 > 其他分享 >AtCoder Regular Contest 153 D Sum of Sum of Digits

AtCoder Regular Contest 153 D Sum of Sum of Digits

时间:2023-05-30 20:46:34浏览次数:73  
标签:Digits AtCoder typedef pw 10 int Sum long

洛谷传送门

AtCoder 传送门

又浪费一道好题

我首先想的是,\(x\) 显然最优取某些 \(a_i\) 往前进位时的值。然后就误以为 \(x\) 的取值是 \(O(n \log_{10} V)\) 的了……

既然没发现什么性质,那就直接 dp 吧!设 \(f_{d, i}\) 为从低到高前 \(d\) 位,所有 \(a_i\) 进位之和为 \(i\)。然后可以发现,把所有 \(a_i\) 按照 \(a_i \bmod 10^d\) 从大到小排序,在这一位进位的只可能是前面几个值。做完了?

code
// Problem: D - Sum of Sum of Digits
// Contest: AtCoder - AtCoder Regular Contest 153
// URL: https://atcoder.jp/contests/arc153/tasks/arc153_d
// Memory Limit: 1024 MB
// Time Limit: 5000 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 = 200100;

int n, a[maxn], pw[12], f[12][maxn];

void solve() {
	scanf("%d", &n);
	pw[1] = 1;
	for (int i = 2; i < 12; ++i) {
		pw[i] = pw[i - 1] * 10;
	}
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	mems(f, 0x3f);
	f[0][0] = 0;
	for (int d = 1; d <= 10; ++d) {
		sort(a + 1, a + n + 1, [&](int x, int y) {
			return x % pw[d] > y % pw[d];
		});
		for (int k = 0; k <= 9; ++k) {
			int c = 0, s = 0;
			for (int i = 1; i <= n; ++i) {
				c += (((a[i] / pw[d]) % 10 + k) >= 10);
				s += ((a[i] / pw[d]) % 10 + k) % 10;
			}
			f[d][c] = min(f[d][c], f[d - 1][0] + s);
			for (int i = 1; i <= n; ++i) {
				if ((a[i] / pw[d]) % 10 + k == 9) {
					++c;
					s -= 9;
				} else {
					++s;
				}
				f[d][c] = min(f[d][c], f[d - 1][i] + s);
			}
		}
	}
	int ans = 2e9;
	for (int i = 0; i <= n; ++i) {
		ans = min(ans, f[10][i] + i);
	}
	printf("%d\n", ans);
}

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

标签:Digits,AtCoder,typedef,pw,10,int,Sum,long
From: https://www.cnblogs.com/zltzlt-blog/p/17444342.html

相关文章

  • AtCoder Regular Contest 161
    PrefaceARC战俘闪总出列这场一上来就感觉状态不太对,先是A顺序敲反WA了一发,然后C题看到秒出一个贪心然后也WA了看一眼榜发现D过的比C多,然后跑去把D写了,中间还偷偷挂了两发最后50min回去沉淀C题,结果换了两种写法都还是一样的挂,后面发现想法还是有纰漏总结:彩笔A-MakeM考虑......
  • AtCoder Regular Contest 148 E ≥ K
    洛谷传送门AtCoder传送门是一道不错的计数。考察合法序列的形态,容易发现:不能出现两个\(<\frac{k}{2}\)的数相邻;如果\(x<\frac{k}{2},y\ge\frac{k}{2}\),那么\(|y-\frac{k}{2}|\ge|x-\frac{k}{2}|\)。考虑不直接排列,而是按照一定的顺序插入。考虑按照\(|x......
  • AtCoder Beginner Contest 290(D,E)
    AtCoderBeginnerContest290(D,E)D(思维,数学)D这个题的大意就是我们需要标记\(n\)个位置,他是这样标记的,一开始有一个初始值为\(0\)的\(x\),第一个标记的是\(0\)位置,然后下一步,我们把\(x\)变成\((x+d)modn\),如果这个位置没有被标记,否则把\(x\)变成\((x+1)modn\),这个是没有......
  • AtCoder Regular Contest 161 E Not Dyed by Majority (Cubic Graph)
    洛谷传送门AtCoder传送门给构造题提供了一种新的思路。如果答案占总方案数的比较大,可以考虑随机化。例如本题,考虑随机化,难点变成判断一个方案是否可行。考虑2-SAT,如果一个点是\(\text{B}\),那么对于这个点的边,有一条边的另一个端点是\(\text{W}\),那么其他两个都是\(\text{......
  • AtCoder Beginner Contest 303 题解 A - E
    A-SimilarString题目大意忽略0和o的差别以及1和l的差别比较两个字符串。解题思路可以硬求,直接写个超长的if判断一下。可以对两个字符串进行修改,0都换成o,1都换成l,然后直接比较两个字符串。ACCode硬求#include<iostream>#include<algorithm>#include<cstring>#i......
  • AtCoder Beginner Contest 303 G Bags Game
    洛谷传送门AtCoder传送门经典题,考虑区间dp,\(f_{l,r}\)表示只考虑\([l,r]\)区间,先手得分减后手得分最大值。对于第一种操作直接\(f_{l,r}\gets\max(a_l-f_{l+1,r},a_r-f_{l,r-1})\),第二种操作,考虑枚举\([l,r]\)长为\(r-l+1-B\)的子段,即可转移。第三种操......
  • AtCoder Beginner Contest 298(D,F)
    AtCoderBeginnerContest298(D,F)D(思维,模拟,快速幂)D大意是最初有一个数字\(1\),然后进行\(q\)个操作有三种操作\(1\),输入\(1,x\),在原来的数字后面添加一个尾数,例如原本的数是\(12\),输入了\(15\),数字变成了\(125\)\(2\),输入\(2\),把原来的数字第一位数删除,例如原本的数是......
  • AtCoder Beginner Contest 299(E,F)
    AtCoderBeginnerContest299(E,F)E(最短路)E题目大意为有\(n\)个点和\(m\)条边,我们我个这些点匹配颜色(有两种颜色),但是要满足下面的条件必须由一个点的颜色是\(1\)然后给出\(k\)点限制对于\(p_i\)这一个点,离他最近的一个颜色为\(1\)的点的最近距离为\(d_i\)既然知道某个点......
  • Firms sign investment deals worth $8.6b at Invest Beijing Global Summit
    Beijingwillcontinuetobeanattractiveinvestmentdestinationforforeigninvestors,asthecityisattheforefrontoftechnologicalinnovation,hasasoundbusinessenvironment,andmakesgreatereffortsindrivingreformandopening-up,saidexecuti......
  • Atcoder Grand Contest 062 D - Walk Around Neighborhood
    csy/bxwjz/bx首先将\(a\)排序,如果\(\sum\limits_{i=1}^{n-1}a_i<a_n\)显然就是\(-1\),否则必然有解。先发现一个trivial的事情,就是答案一定位于\([\dfrac{a_n}{2},a_n]\)中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以\((a_n,0),(0,a_n),(-a_n,0),(......