这个题我最开始真的是写麻烦了,其实想法确实一样的,问你在保证每个鬼过来的时候有r个蜡烛在燃烧,每个蜡烛的燃烧周期是t。
我们一个蜡烛一个蜡烛考虑就可以写了,把第i个蜡烛的 i+1个蜡烛考虑下就行
贴下我以前的代码····
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
int a[MAX];
int b[MAX];
int main()
{
int n,m,t,k;
int sum = 0;
cin>>n>>t>>k;
for(int i = 0; i<n; i++)cin>>a[i];
if(t<k)
{
cout<<-1<<endl;
return 0;
}
for(int j = 0; j<k; j++)
{
b[j] = a[0] - k + j;
}
sum = k;
for(int i = 1; i<n; i++)
{
for(int j = 0; j<k; j++)
{
if(b[j]<a[i])
{
m = 0;
while(b[j]+m*(1+t)<a[i])
{
m++;
sum++;
}
b[j] = b[j]+m*(1+t);
}
}
}
cout<<sum<<endl;
return 0;
}
我错误的原因在于···我是判断的有多少个t+1的周期,实际上,你只需要看第i+1的蜡烛在鬼魂来之前的什么时候点亮就可以
再贴下正确的
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
int a[MAX];
int b[MAX];
int main()
{
int n,m,t,k,r;
int i,j;
int sum = 0;
cin>>n>>t>>r;
if(t<)
{
cout<<-1<<endl;
return 0;
}
for(int i = 0; i<n; i++)
{
cin>>a[i];
k = 0;
while((b[a[i]])<r)
{
for(j = a[i]; j<a[i]+t-k; j++)
b[j]++;
k++;
sum++;
}
}
cout<<sum<<endl;
return 0;
}
/*
4 8 3
5 8 10 26
*/
超级简单····
还是要以蜡烛考虑