前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >G - Postman ZOJ - 4096 【 思维题--送信只需要判断最后的最长路径 】

G - Postman ZOJ - 4096 【 思维题--送信只需要判断最后的最长路径 】

作者头像
Lokinli
发布2023-03-09 15:12:09
1630
发布2023-03-09 15:12:09
举报
文章被收录于专栏:以终为始以终为始

G - Postman

ZOJ - 4096 

&:其他的地方无论怎么送,都要有来一次回到 0 点去拿剩余的信件,所以路程都是这个点的坐标乘以二,只要判断最后一次的 k 封往同一侧【 这里是指在 0 的同一侧】的那边送就可以了,题目中说最后一次可以不必回到 0 ,所以最后一次肯定选最长的那个点,那样就不必再返回,省去的路就是最大的了。 &:答案 = 所有按 k 个一组送信的点 * 2  - 单侧最远的那个点。

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k;
ll solve(ll a[], ll n)
{
    ll p = n;
    ll res = 0;
    while(p > 0)
    {
        res += a[p]*2ll;
        p -= k;
    }
    return res;
}
ll a[100005];
ll b[100005];
int main()
{
    ll t,n;
    scanf("%lld", &t);
    while(t--)
    {
        scanf("%lld %lld", &n, &k);
        ll p1,p2,x;
        p1=0;p2=0;
        for(ll i = 0; i < n; i ++)
        {
            scanf("%lld", &x);
            if(x>0)a[++p1] = x;
            else if(x < 0) b[++p2] = -x;
        }
        ll res = 0;
        res = 0;
        sort(a+1,a+1+p1);
        res += solve(a,p1);
        sort(b+1,b+1+p2);
        res += solve(b,p2);
        ll tmp = max(a[p1],b[p2]);
        res -= tmp;
        printf("%lld\n",res);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • G - Postman
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档