A. Coffee Break(思维题,类似于邻接表的head数组用法)

题:https://codeforces.com/gym/101911/problem/A

题意:每天工作m分钟,每次喝coffee得间隔d分钟,然后给出n个数,每个数表示想在一天中的a[i]的时刻喝coffe,问最少喝完的天数

分析:先对数组升序排,若满足间隔的d就向前一个建立联系;

#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int ans[M],head[M];
pair<int,int >a[M];
int main(){
    int n,m,d;
    scanf("%d%d%d",&n,&m,&d);
    for(int i=0,x;i<n;i++)
        scanf("%d",&x),a[i].first=x,a[i].second=i;
    sort(a,a+n);
    int j=0;
    head[0]=-1;
    for(int i=1;i<n;i++){
        if(a[i].first-a[j].first>d)
            head[i]=j,j++;
        else
            head[i]=j-1;
    }
    int tot=0;
 
    for(int i=n-1;i>=0;i--){
        if(!ans[a[i].second]){
            tot++;
            for(j=head[i];~j;j=head[j])
                ans[a[j].second]=tot;
            ans[a[i].second]=tot;
        }
    }
    printf("%d\n",tot);
    for(int i=0;i<n;i++)
        printf("%d ",ans[i]);
    return 0;
}
View Code

 

posted @ 2019-10-11 20:13  starve_to_death  阅读(206)  评论(0编辑  收藏  举报