D1. Toy Train (Simplified) 和 D2. Toy Train

2023-03-09 19:39:03 浏览数 (1)

Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2)

Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)

题意:分别在不同的起点出发,把糖果运到相应的编号的车站需要的最小距离,在每一站火车只能装一个糖果,相邻车站距离是 1.

&:因为只能装一个糖果,所以对于一个车站来说,有几个糖果就需要转好几圈,不同的是最后一圈可能会少些,因为不需要再回来了,这样花费 cost = ( 糖果个数 - 1 ) × 车站个数,对于最后一个来特别加一下就好了,当然就是最小的情况加上,因为最后一次尽量跑的小一些。

代码语言:javascript复制
#include<bits/stdc  .h>
using namespace std;
typedef long long ll;
const int maxn = 250;
vector<int>st[maxn];
int n,m;
int a,b;
int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i   )
    {
        scanf("%d %d", &a, &b);
        int x;
        if(b >= a) x = b - a;  // 从该车站到目的地的花费
        else x = n - a   b; // 如果是 5 2 ,那么是后半圈
        st[a].push_back(x);
    }
    for(int i = 1; i <= n; i   )
    {
        sort(st[i].begin(), st[i].end()); // 排序
    }
    for(int i = 1; i <= n; i   ) // 每个站点作为起点
    {
        int res = -1;
        for(int j = 1; j <= n; j   )
        {
            if(!st[j].size()) continue;  // 如果没有糖果了,就不用停下来装了
            int x = 0;
            if(i <= j) x = j - i; // 从起始点到有糖果的点的距离
            else x = n - i   j;
            int y = st[j].size() - 1;  // 糖果数量 - 1 都需要重新回来装
            x  = y * n;  // 这些糖果都要回到这个点装,所以每次都是 n 个距离
            x  = st[j][0]; // 最后一个装需要走的距离最小的糖果就可以了
            if(res < x) res = x;
        }
        printf("%d ",res);
    }
    return 0;
}

版权声明:本文为CSDN博主「Mercury_Lc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Mercury_Lc/article/details/88063269

sdn

0 人点赞