codeforces508C

 题意:共有m个鬼,每个鬼的到访时间为wi,且就存在wi这1秒。现有r根蜡烛,每根蜡烛的燃烧时间为t,每次鬼出现时保持r根蜡烛为点燃的状态,且蜡烛点燃需要1秒的时间,若x时刻点燃蜡烛,蜡烛的存在时间为x+1到x+r,x+r的下一个时刻蜡烛就熄灭了。求鬼出现的这m次中,需要点燃蜡烛的最小数量。

思路:若t<r时,不能满足在第i个鬼处同时燃烧着r根蜡烛,因为在一个时刻一次只能点燃一根蜡烛,所以直接输出-1

t>=r时,首先记录w1(第一个鬼出现的时刻)前点燃r根蜡烛的时刻,并记录总和(第一次放所有蜡烛的个数r)。之后依次比较(记录蜡烛的这几个时刻+蜡烛的燃烧时间t)与下一个wi之间的大小若前者小于后者表明最后蜡烛燃着时间到不了wi,那么总和就要加一(需要再点燃一根新的蜡烛)。每次循环只要考虑当前wi下时之前记录的蜡烛的时刻,并且更新时刻,更新时刻时,用当前wi的值减去num++(num初值为1)

完整代码

#include <bits/stdc++.h>
using namespace std;
int w[305],c[305];

int main()
{
    int m,t,r,ans=0;
    cin>>m>>t>>r;
    for(int i=1;i<=m;i++)
        cin>>w[i];
    if(t<r)
        cout<<-1<<endl;
    else
    {
        for(int i=1;i<=r;i++)
        {
            c[i]=(w[1]-r)+(i-1);
            ans++;
        }
        for(int i=2;i<=m;i++)
        {
            int num=1;
            for(int j=1;j<=r;j++)
            {
                if(c[j]+t<w[i])
                {
                    ans++;
                    c[j]=w[i]-num++;    
                }    
            }    
        }
        cout<<ans<<endl;    
    }
    return 0;
}
原文地址:https://www.cnblogs.com/benzikun/p/11190957.html