首页 > 其他分享 >[Codeforces] CF1591C Minimize Distance

[Codeforces] CF1591C Minimize Distance

时间:2023-11-30 21:14:34浏览次数:48  
标签:le Minimize 1000000000 Codeforces int CF1591C 货物

CF1591C Minimize Distance

题目

一条线上有 \(n\) (\(1 \le n \le 2 \cdot 10^5\))个仓库,第 \(i\) 个仓库的位置是 \(x_i\) (\(1 \le i \le n\))。

你有 \(n\) 箱货物,要分别运到这 \(n\) 个仓库里。你的初始位置在点 \(0\) ,一次可以携带 \(k\) (\(1 \le k \le n\)) 箱货物。在送完携带的所有货物后,需要返回点 \(0\) 去取货物。

请求出送完所有货物时走的最短路程。

样例输入

4
5 1
1 2 3 4 5
9 3
-5 -10 -15 6 5 8 3 7 4
5 3
2 2 3 3 3
4 2
1000000000 1000000000 1000000000 1000000000

样例输出

25
41
7
3000000000

思路

首先来画幅图:

那么,最优策略肯定是每次都那尽量多的货物出发,当货物没了之后再回到原点取货:

但是假如剩余的仓库小于\(k\)个呢?

不难发现,即便是此时,上述方法依然是最优的,但同时也是唯一的

所以整体思路就这么定下来了

然后发现,其实在最后一次送货之后是没必要再返回原点地,而最后一次送货有可能去\(a[n]\),也有可能去\(a[1]\)(这里假定\(a\)数组天然递增)

那么整个的最优解就需要再减掉一个\(max\{a[n],|a[1]|\}\)

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Maxn=2e5+10;
int n,k,ans,now;
int a[Maxn];
void run()
{
	cin>>n>>k;ans=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n && a[i]<0;i+=k) ans+=2*abs(a[i]);
	for(int i=n;i>=1 && a[i]>0;i-=k) ans+=2*abs(a[i]);
	cout<<ans-max(abs(a[1]),abs(a[n]))<<endl;
}
signed main()
{
	int t;
	cin>>t;
	while(t--) run();
}

标签:le,Minimize,1000000000,Codeforces,int,CF1591C,货物
From: https://www.cnblogs.com/lyk2010/p/17868350.html

相关文章

  • [Codeforces] CF1603A Di-visible Confusion
    CF1603ADi-visibleConfusion题目给一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),对于每个位置\(i\),如果\(a_i\%\left(i+1\right)\not=0\),就可以将\(a_i\)删掉。删掉之后,后面的数都会往前面移动一位。问能否将序列删成空。数据范围\(1\let\le10^4,1\len\le10^5,1\le......
  • Codeforces Round 883 (Div. 3)
    CodeforcesRound883(Div.3)A.RudolphandCuttheRope题意:有一颗糖果在连在绳子上,求剪短多少根绳子,他能落地思路:只要绳子长度比钉子高度大就不用减#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,res=0;cin>>n;while(n--)......
  • Codeforces Round 911 (Div. 2)
    CodeforcesRound911(Div.2)基本情况A题秒了。B题条件没想明白,也不造点数据就无脑交,导致罚了不少时。B.LauraandOperations我先推出了,对于一个数,当另外两个数的个数之和为偶数时解可行,且这个数本身要能跟后面数替换。比如11223333就可以操作122333(1......
  • Codeforces Round 910 (Div. 2)
    https://codeforces.com/contest/1898C题可以造一个大小为4的环,然后再造一个来回,这样就解决了%4=0,%4=2的情况,而奇数的情况显然无解。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#includ......
  • Codeforces Round 829 (Div. 1)A1. Make Nonzero Sum (easy version)(思维找规律)
    先考虑无解的情况:当n为奇数时无解相邻的两个元素一定可以变成0\[a[i]!=a[i+1]时,分成[i,i],和[i+1,i+1]\]\[a[i]=a[i+1]时,分成[i,i+1]\]这两种情况对答案的贡献都是0,当n为奇数时我们总会有一个没办法凑成0.#include<bits/stdc++.h>#definelsp<<1#......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    A.LineTripThereisaroad,whichcanberepresentedasanumberline.Youarelocatedinthepoint\(0\)ofthenumberline,andyouwanttotravelfromthepoint\(0\)tothepoint\(x\),andbacktothepoint\(0\).Youtravelbycar,whichs......
  • Codeforces Round 911 (Div. 2) D
    CodeforcesRound911(Div.2)DD.SmallGCD题意定义\(f(a,b,c)\)为\(a,b,c\)中较小两个数的\(gcd\),给定数组\(a_{1...n}\),求\(\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}\sum\limits_{k=j+1}^{n}f(a_i,a_j,a_k)\)题解显然可以先排序,不会影响结果,排完序后\(a_k\)就......
  • Codeforces Round 903 (Div. 3)
    CodeforcesRound903(Div.3)A.Don'tTrytoCount大概题意给你两个字符串a,b。a串可进行的操作为将整个a串复制到之前的a串后面(直接用a+a即可),然后看操作多少次可以让b串变为a串的子串如果不能就输出-1。#include<iostream>usingnamespacestd;stringa,b;voidsolve()......
  • Codeforces Round 894 (Div. 3)
    CodeforcesRound894(Div.3)A.GiftCarpet题意:判断一列一个字母有没有“vika”思路:挨个枚举每一列#include<bits/stdc++.h>usingnamespacestd;charmp[25][25];charx[]={'v','i','k','a'};voidsolve(){intm,n;cin>>......
  • Codeforces Round 911 (Div. 2) D. Small GCD
    题目链接:https://codeforces.com/contest/1900/problem/D对于已经排序好的数组\(a\),我们需要计算:\[\sum_{i=1}^n\sum_{j=i+1}^ngcd(a_i,a_j)*(n-j)\]由于\(\sum_{d|n}\phi(d)=n\),因此:\[\gcd(a_i,a_j)=\sum_{d|a_i,d|a_j}\psi(d)\]代入可得:\[\sum_{i=1}^n\su......