KunKun的征途

明天的明天,你还会送我水晶之恋吗?

导航

[CF #288-C] Anya and Ghosts (贪心)

Posted on 2015-01-28 19:18  西域小车  阅读(161)  评论(0)    收藏  举报

题目链接: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 }