A2. Toy Train

题意(连接:http://codeforces.com/contest/1129/problem/A2)

就是小火车在环形铁路上开,遇到车站每次都可以装卸糖果,以某个车站为起点,问把每一个糖果都卸到指定车站的最短时间,输出所有可能性结果

分析

对于一个车站,有x个糖果,至少要经过这个车站x次,因为每次都只能装一颗,那就意味着至少要跑x-1圈,那么在一圈中肯定已经经过了要卸货的车站,因为一圈嘛,所有的车站都经过了一遍,所以对于一个车站,再次经过该车站的时候之前从该车站装上的货物肯定卸了,所以对于x-1圈来说,该车站的x-1颗糖果已经卸完了,一个车站的糖果全部卸完就需要(x-1)*n+最后一颗糖果需要的时间,那么如果不是以该车站为火车开始的起点的话,还要加上从起点到该车站的时间,只要双重遍历就可以,1.以某个车站为起点,2.所有车站的时间,取最大值,就可以算出以所有车站为起点所需的时间啦

代码

#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <algorithm>
using namespace std;
#define ll long long
int cnt[5005];
int main(void) {
	int n, m;
	cin >> n >> m;
	int nearest[5005];
	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		b = b > a ? b : b + n;
		if (!cnt[a] || b < nearest[a])
			nearest[a] = b;
		cnt[a]++;
	}
	for (int i = 1; i <= n; ++i) {//每一个车站为起点
		int time=0;
		for (int j = 1; j <= n; ++j) {//每一个车站的最小时间
			if (!cnt[j])
				continue;
			int x = (cnt[j]-1) * n + (nearest[j]+(i>j?n: 0));//前n-1圈的时间加上最后一圈的时间
			time = max(x, time);
		}
		cout << time-i << " ";
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值