列表

详情


NC54709. 泡面

描述

牛牛在一辆有个座位的火车上,假设座位排成一行。牛牛将这些座位从左至右编号为。每个座位上都是一位商务人士,所以他们很忙,以至于在火车上只能吃泡面。

火车开水房在第一个座位的左侧。第个人选择在t_i时刻开始,观察从的座位有无空位,如果有,他会认为这个人去接水吃泡面了,于是他会等一会,如果没有,他会去接水吃泡面。

接一桶泡面用水需要的时间间隔,忽略从座位到接水口之间的时间,且接完水之后成功人士会立刻回到座位。

如果同时有多个人要去接水吃泡面,离接水口最近的人会先发制人,去接水,其他人则会坐在座位上继续观察。

这些成功人士想知道他们什么时候能接完水吃到泡面。

输入描述

第一行:两个整数
第二行:个非负整数t_i
,

输出描述

共一行:个非负整数,表示每位成功人士回到座位的时间。

示例1

输入:

5 3
1 3 5 7 9

输出:

4 7 10 13 16

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 88ms, 内存消耗: 6836K, 提交时间: 2019-12-10 14:50:33

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
#define ll long long
struct node
{
    int id;
    ll p;
}a[maxn];
 
bool cmp(const node &A,const node &B)
{
    if(A.p==B.p) return A.id<B.id;
    return A.p<B.p;
}
 
bool operator<(const node &A,const node &B)
{
    return A.id>B.id;
}
priority_queue <node> q;
 
ll ans[maxn];
 
 
int main()
{
    int n;
    ll k,y;
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&y);
        a[i]=(node){i,y};
    }
    sort(a+1,a+n+1,cmp);
    int l=0;
    ll tmp=0;
    for(int i=1;i<=n;i++)
    {
        if(q.empty())
        {
            q.push(a[++l]);
        }
        node u=q.top();
        q.pop();
        ans[u.id]=max(tmp+k,u.p+k);
        tmp=ans[u.id];
 
        while(a[l+1].p<=tmp&&l<n)
        {
            q.push(a[++l]);
        }
    }
 
    for(int i=1;i<=n;i++)
    {
        printf("%lld ",ans[i]);
    }
 
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 119ms, 内存消耗: 4752K, 提交时间: 2019-12-17 19:50:37

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std; 
typedef long long ll;
pair<int,int>t[100005];
ll ans[100005];
int main()
{
	ll n,p;
	cin>>n>>p;
	for(int i=1;i<=n;i++)cin>>t[i].first,t[i].second=i;
	sort(t+1,t+1+n);
	priority_queue< int , vector<int> , greater<int> >q;
	ll now=0;
	for(int i=1;i<=n;i++)
	{
		if(t[i].first<=now){
			q.push(t[i].second);
			continue;
		}
		if(q.empty())
		{
			now=t[i].first+p;
			ans[t[i].second]=now;
		}
		else
		{
			int x=q.top();q.pop();
			ans[x]=now+p;
			now+=p;
			i--;
		}
	}
	while(!q.empty())
	{
		int x=q.top();q.pop();
		ans[x]=now+p;
		now+=p;
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
} 

上一题