首页 > 其他分享 >Equal Cut (AtCoder - arc100_b)(前缀和,思维)

Equal Cut (AtCoder - arc100_b)(前缀和,思维)

时间:2024-07-15 11:42:58浏览次数:11  
标签:AtCoder Cut abs Min int Equal arc100 ++ num

题目来源:https://atcoder.jp/contests/abc102/tasks/arc100_b?lang=en
//
题意:将一串数字分为四段,求出每段的总和,怎么分,才能让这四段的各自总和的极差最小?
//
思路:“实在是想不出来好的算法,只会暴力,当时想的枚举中间的那一刀,然后左右二分,但是感觉也不太好写,毕竟我总是被二分的边界恶心”,题解一看,居然能有O(n)的算法,实在是太优美。
里面是有思维优化的,要让极差最小,无非就是把这四段分的均匀点。这个很重要啊,然后也是枚举中间的j变量,枚举一次,左边和右边i和k,就让各自的两段分均匀。
用的前缀和来比较的,注意:
//
//
//

右边的k同理
//
//
题解代码:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+9;
int Min=INT64_MAX;
vector<int>a(N,0);

signed main() {
    int n, num;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> num;
        a[i] += a[i - 1] + num;
    }

    for (int i = 1, j = 2, k = 3; j < n; ++j) {
        while (i + 1 < j && abs(a[j] - 2 * a[i]) > abs(a[j] - 2 * a[i + 1])) ++i;
        while (k + 1 < n && abs(a[n] + a[j] - 2 * a[k]) > abs(a[n] + a[j] - 2 * a[k + 1])) ++k;
        Min = min(Min, max({a[i], a[j] - a[i], a[k] - a[j], a[n] - a[k]})- min({a[i], a[j] - a[i], a[k] - a[j], a[n] - a[k]}));
    }
    cout << Min << endl;
    return 0;
}

标签:AtCoder,Cut,abs,Min,int,Equal,arc100,++,num
From: https://www.cnblogs.com/yongchaoD/p/18302850

相关文章

  • Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)
    ⚪题和板题大赛/jk好像能切的样子,但是太菜了,唐了8罚。A-BuyaPen输出除去某个颜色以外,其他颜色代表的最大值。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inta,b,c;strings;signedmain(){cin>>a>>b>>c;cin>>s;if(s[0]=='R')a=103......
  • Solution - Atcoder AGC022D Shopping
    考虑到不管怎么走,都是\(0\)最后又绕回\(0\),于是答案肯定是\(2L\)的倍数。那么考虑\(\frac{\operatorname{ans}}{2L}\)即可。那么对于\(t_i\),可以先让答案加上\(\lfloor\frac{t_i}{2L}\rfloor\),同时令\(t_i\leftarrowt_i\bmod2L\)。原因就是考虑到这被去除掉的\(2......
  • Toyota Programming Contest 2024#7(AtCoder Beginner Contest 362)
    这场比赛还是比较水的A,B,C跳过D题dij把点权和边权都转换为边权即可E题DP可以用\(map\)存一下等差数列的差先说\(O(n^4)\),\(f_{len,i,j,t}\)分别表示长度,现在在\(i\),上一个在\(j\)显然动态转移方程就有了\(f_{len,i,j,k}=\sum_{k=1}^{k=j-1}f_{len-1,j,k,t}\)点击查看......
  • AtCoder Beginner Contest 362 补题记录(A~E,G)
    A分三类情况讨论即可。voidsolveqwq(){intr=io.read(),g=io.read(),b=io.read();stringqwq=io.readstring();if(qwq=="Blue")printf("%lld\n",min(r,g));elseif(qwq=="Red")printf("%lld\n",......
  • Solution - Atcoder AGC021D Reversed LCS
    考虑到\(\operatorname{LCS}(T,T')\)这个形式实在是不太优美,考虑转化一下形式。感受一下,能够知道\(T\)的最长回文子序列\(|\operatorname{LPS}(T)|=|\operatorname{LCS}(T,T')|\)。具体证明可以见zhihu,本人暂时还没看懂。那么接下来对于单个串的\(\operatorname{LPS......
  • Solution - Atcoder ARC127E Priority Queue
    考虑转化一下,每个最后留下来的集合都相对的对应着一个被删除的集合。于是考虑去对被删除的数去计数。然后贪心的,去让每一次\(2\)操作删除的数都是前面加入中还剩下的最后加入的数(因为有的可能被前面的\(2\)操作删了)。对于证明,考虑到如果不是剩下的最后加入的,那么中间可能会......
  • 【CF1656H】Equal LCM Subsets
    【CF1656H】EqualLCMSubsets题意给定集合\(A\)和\(B\),从中选择两个子集\(A'\subseteqA,B'\subseteqB\)满足\(\operatorname{lcm}(A')=\operatorname{lcm}(B')\)。满足\(\lvertA\rvert,\lvertB\rvert\le10^3,A,B\le4\times10^{35}\)。......
  • 【atcoder】习题——位元枚举
    题意:求i&M的popcount的和,i属于0……N主要思路还是变加为乘。举个例子N=22,即10110假设M的第3位是1,分析N中:00110001110010000101发现其实等价于0010001100000001也就是左边第4位和第5位不变,右边第1位和第2位不变拼接起来,相当于0000~001101110011110110001101......
  • Java Executors类的9种创建线程池的方法及应用场景分析
    在Java中,Executors类提供了多种静态工厂方法来创建不同类型的线程池。在学习线程池的过程中,一定避不开Executors类,掌握这个类的使用、原理、使用场景,对于实际项目开发时,运用自如,以下是一些常用的方法,来一一细说:newCachedThreadPool():创建一个可缓存的线程池,如果线程池中......
  • G. The Great Equalizer
    原题链接题解每次操作都会是排序后的元素差值减一,所以答案为初始序列最大值加上最大差值用STL的multiset维护差值和序列值code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lla[200005];voidsolve(){intn;cin>>n;multiset<ll>s......