首页 > 代码库 > Codeforces Round #288 (Div. 2) C. Anya and Ghosts
Codeforces Round #288 (Div. 2) C. Anya and Ghosts
Anya loves to watch horror movies. In the best traditions of horror, she will be visited by m ghosts tonight. Anya has lots of candles prepared for the visits, each candle can produce light for exactly t seconds. It takes the girl one second to light one candle. More formally, Anya can spend one second to light one candle, then this candle burns for exactly t seconds and then goes out and can no longer be used.
For each of the m ghosts Anya knows the time at which it comes: the i-th visit will happen wi seconds after midnight, all wi‘s are distinct. Each visit lasts exactly one second.
What is the minimum number of candles Anya should use so that during each visit, at least r candles are burning? Anya can start to light a candle at any time that is integer number of seconds from midnight, possibly, at the time before midnight. That means, she can start to light a candle integer number of seconds before midnight or integer number of seconds after a midnight, or in other words in any integer moment of time.
The first line contains three integers m, t, r (1?≤?m,?t,?r?≤?300), representing the number of ghosts to visit Anya, the duration of a candle‘s burning and the minimum number of candles that should burn during each visit.
The next line contains m space-separated numbers wi (1?≤?i?≤?m, 1?≤?wi?≤?300), the i-th of them repesents at what second after the midnight the i-th ghost will come. All wi‘s are distinct, they follow in the strictly increasing order.
If it is possible to make at least r candles burn during each visit, then print the minimum number of candles that Anya needs to light for that.
If that is impossible, print ?-?1.
1 8 3 10
3
2 10 1 5 8
1
1 1 3 10
-1
思路:用结构体表示蜡烛,里面记录这根蜡烛燃烧的时间段,然后扫描鬼魂拜访时间,在come[i] 时刻判断有哪些蜡烛在燃烧,没有燃烧的就要在come[i]时刻之前将它点燃,点燃它的时刻点离come[i]越近越好,所以从come[i]-1时刻往前推。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 1005 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r typedef long long ll; using namespace std; struct St { int s,e; }st[maxn]; int m,t,r; int come[maxn]; int dian[maxn]; int main() { while (~scanf("%d%d%d",&m,&t,&r)) { memset(dian,0,sizeof(dian)); for (int i=0;i<r;i++) { st[i].s=-1; st[i].e=-1; } for (int i=0;i<m;i++) scanf("%d",&come[i]),come[i]+=300; //鬼魂到来的时刻,要预先加300 int ans=0; //最少的蜡烛数 int ff=1; //标记是否能达到要求 for (int i=0;i<m;i++) //遍历鬼魂到来的时刻点 { int tt=come[i],ss=come[i]; tt--; //先自减,要从tt时刻从后向前推看哪个时刻能够点蜡烛,这样就能保证用最少的蜡烛 for (int j=0;j<r;j++) //判断r跟蜡烛 { if (st[j].e<ss) //第j跟蜡烛在ss时刻,也就是鬼魂到来之前就燃烧完了,需要再点一根 { int flag=0; //标记能否将这根蜡烛点亮 while (tt+t>=ss) { if (!dian[tt]) //在tt时刻可以点 { st[j].s=tt; //重新记录第j跟蜡烛的燃烧时间段 st[j].e=tt+t; dian[tt]=1; //标记,以后该时刻不能点了 ans++; //蜡烛数自增 flag=1; break; } tt--; //tt往前推 } tt--; if (!flag) //不能点亮 ff=0; //不符合要求,要输出-1 } } } if (ff) printf("%d\n",ans); else printf("-1\n"); } return 0; }
Codeforces Round #288 (Div. 2) C. Anya and Ghosts