题目链接:http://codeforces.com/contest/508/problem/C
题目大意:给你三个数,m,t,r,代表晚上有m个幽灵,我有无限支蜡烛,每支蜡烛能够亮t秒,房间需要r支蜡烛才能被点亮。
接下来有m个数,w[0..m-1],每个幽灵会在w[i]秒来光顾,在w[i]+1秒结束光顾。当房间被点亮的时候,幽灵就不会来了,现在问你,最少需要多少支蜡烛,使得一晚上都没有幽灵来光顾。若不能达到,则输出-1。
蜡烛可能在傍晚来临之前或者傍晚来临之后点亮,每秒只能点亮一支蜡烛,点亮一支蜡烛需要1秒。
解法是贪心:贪心策略是按照最右边的区间,往左边走。因为这样才可能让一支蜡烛覆盖到的时间区间最大。
只有t<r时无解,因为t=r时能够错开来,使得存在1s钟是有r支蜡烛同时点亮着。
自己竟然写了好多代码都过不了,自己太弱了,还是需要多加练习呀。。。
bit是我之前写了个树状数组。。后来发现没必要而且不好用。。(所以不要学了数据结构就非要用。。)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 typedef long long LL; 7 8 const int MAX_N = 999; 9 int bit[MAX_N]; 10 int m,t,r,w[MAX_N]; 11 12 void add(int i,int x){ 13 bit[i]+=x; 14 } 15 16 int sum(int x){ 17 int res = 0; 18 for(int i=0;i<=x;i++) res+=bit[i]; 19 return res; 20 } 21 22 int main(){ 23 while( scanf("%d%d%d",&m,&t,&r)!=EOF ){ 24 memset(bit,0,sizeof(bit)); 25 for(int i=0;i<m;i++){ 26 scanf("%d",&w[i]); 27 } 28 if( t<r ){ 29 puts("-1"); 30 continue; 31 } 32 int minn = MAX_N; 33 int ans = 0; 34 for(int i=m-1;i>=0;i--){ 35 int now = sum(w[i]); 36 37 if( now<r ){ 38 for(int j=0;j<r-now;j++){ 39 int bg = max(0,w[i]+1+j-t); 40 // printf("%d----%d\n",bg,bg+t+1); 41 add(bg,1); 42 add(bg+t+1,-1); 43 ans++; 44 } 45 } 46 } 47 printf("%d\n",ans); 48 } 49 return 0; 50 }
浙公网安备 33010602011771号