CF1462

阅读: 评论:0

CF1462

CF1462

D. Add to Neighbour and Remove - CF1462D

codeforces1462D

题意:

给出一个由n个数组成的数组,现在你可以对这个数组进行如下操作:将数组中的一个元素加到这个元素的两边中的一边,然后将这个元素删掉。若该元素在最左边,那么该元素不能加到左边,因为它的左边已经没有元素了,同理最右边。现在问你最少几次这样的操作可以让整个数组的每个元素都相等。

思路:

由于该题目的数据范围并不是很大,只有 1 e 3 1e3 1e3,所以可以用 n 2 n^2 n2的做法得出结果:求出这个数组的前缀和,我们枚举前 n n n个数作为最终数组每个元素的大小,当找到第一个符合的前缀和,也就是可以通过划分这个数组,让这个数组的每个部分和都是当前枚举的前缀和的时候,可以保证其是最优解,当前的操作数就是答案。由于最差情况也可以通过全部合并得出,所以不存在没有结果的情况。

ac代码:

#include <cstdio>
#include <cstring>const int maxn = 3e3 + 5;int a[maxn], pre[maxn];int main () {int T, n;scanf ("%d", &T);while (T--) {scanf ("%d", &n);for (int i = 0; i < n; ++i) {scanf ("%d", &a[i]);}memset (pre, 0, sizeof pre);pre[0] = a[0];for (int i = 1; i < n; i++) {pre[i] = pre[i - 1] + a[i];}int ans = 0;for (int i = 0; i < n; i++) {int t = 0;bool flag = false;for (int j = 0; j < n; j++) {t = t + a[j];ans++;if (t == pre[i]) {t = 0;ans--;if (j == n - 1) flag = true;} else if (t > pre[i]) break;}if (flag) break;else ans = 0;}printf ("%dn", ans);}return 0;
}

本文发布于:2024-02-04 11:44:24,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170706409755262.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23