codeforces--C - Anya and Ghosts(贪心)

C - Anya and Ghosts

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d
& %I64u

Submit Status

Appoint description: 
System Crawler  (2015-01-28)

Description

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.

Input

The first line contains three integers mtr (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.

Output

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.

Sample Input

Input

1 8 3
10

Output

3

Input

2 10 1
5 8

Output

1

Input

1 1 3
10

Output

-1

Hint

Anya can start lighting a candle in the same second with ghost visit. But this candle isn‘t counted as burning at this visit.

It takes exactly one second to light up a candle and only after that second this candle is considered burning; it means that if Anya starts lighting candle at moment x, candle is buring from second x + 1 to second x + t inclusively.

In the first sample test three candles are enough. For example, Anya can start lighting them at the 3-rd, 5-th and 7-th
seconds after the midnight.

In the second sample test one candle is enough. For example, Anya can start lighting it one second before the midnight.

In the third sample test the answer is ?-?1, since during each second at most one candle can burn but Anya needs three candles to light up the room at the moment when the ghost comes.

题目大意:给出n个鬼访问的时间,和每个蜡烛可以持续的时间,每次访问最少需要的点燃的蜡烛数。问一共最少需要几个蜡烛。

将每个蜡烛的点燃的时间尽量靠近访问的时间,所以,统计第i个访问时点燃的蜡烛,如果少于r,那么要访问的时间开始,向前遍历,找出最近的可以点燃蜡烛的时刻,这样可以保证使用的蜡烛最少。

注意

1、可以在子夜之前点蜡烛,所以要将时间右移。

2、蜡烛持续的时间t和点燃的时间j的关系为,j时刻点蜡烛,j+1到j+t时刻蜡烛亮着。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int a[400] , k[2000] , flag[2000] ;
int main()
{
    int m , t , r , num , i , j , ans ;
    while( scanf("%d %d %d", &m, &t, &r) != EOF )
    {

        memset(k,0,sizeof(k)) ;
        memset(flag,0,sizeof(flag)) ;
        num = 0 ; ans = 0 ;
        for(i = 0 ; i < m ; i++)
        {
            scanf("%d", &a[i] ) ;
            a[i] += 1000 ;
            //flag[ a[i] ] = 1 ;
        }
        for(i = 0 ; i < m ; i++)
        {
            if( num < r )
            {
                for(j = a[i]-1 ; j >= a[i]-t ; j--)
                {
                    if( flag[j] == 0 )
                    {
                        flag[j] = 1 ;
                        k[j+1] += 1 ;
                        k[j+1+t] += -1 ;
                        num++ ;
                        ans++ ;
                    }
                    if( num == r )
                        break ;
                }
                if( num < r )
                    break ;
            }
            for(j = a[i]+1 ; i < m-1 && j <= a[i+1] ; j++)
                num += k[j] ;
        }
        if( num < r )
            printf("-1\n") ;
        else
            printf("%d\n", ans) ;

    }
    return 0 ;
}

时间: 2024-11-03 01:26:23

codeforces--C - Anya and Ghosts(贪心)的相关文章

CodeForces 508C Anya and Ghosts

Anya and Ghosts Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 508C Description Anya loves to watch horror movies. In the best traditions of horror, she will be visited by m ghosts toni

Codeforces Round #288 (Div. 2) C. Anya and Ghosts

C. Anya and Ghosts time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Anya loves to watch horror movies. In the best traditions of horror, she will be visited by m ghosts tonight. Anya has lo

Codeforces 442B Andrey and Problem(贪心)

题目链接:Codeforces 442B Andrey and Problem 题目大意:Andrey有一个问题,想要朋友们为自己出一道题,现在他有n个朋友,每个朋友想出题目的概率为pi,但是他可以同时向多个人寻求帮助,不过他只能要一道题,也就是如果他向两个人寻求帮助,如果两个人都成功出题,也是不可以的. 解题思路:贪心,从概率最大的人开始考虑,如果询问他使得概率变大,则要询问. #include <cstdio> #include <cstring> #include <a

Codeforces Round #300-Tourist&#39;s Notes(贪心)

Tourist's Notes Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Description A tourist hiked along the mountain range. The hike lasted for n days, during each day the tourist noted height above the sea level

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

CodeForce 508C Anya and Ghosts (贪心+模拟)

题目大意:有m个时刻,在第i时刻即wi秒的时候需要保持有r根蜡烛亮着,每根蜡烛维持的时间为t秒,点一根蜡烛需要1秒. 注意:一根蜡烛亮的时间为下一秒开始.并且一开始是可以事先准备蜡烛的. 想法:利用了优先队列,维护r根蜡烛,每次wi秒,它需要开始点蜡烛的最晚时间为wi-t,如果不够这个时间,那么在最晚结束点蜡烛的时间wi-1开始补上. 感谢阿扎夫人提供的思维题. AC代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include&

Codeforces 798D Mike and distribution - 贪心

Mike has always been thinking about the harshness of social inequality. He's so obsessed with it that sometimes it even affects him while solving problems. At the moment, Mike has two sequences of positive integers A = [a1, a2, ..., an] and B = [b1, 

codeforces 349B Color the Fence 贪心,思维

1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1-9每个字母分别要ai升油漆,问最多可画多大的数字. 贪心,也有点考思维. #include<bits/stdc++.h> using namespace std; #define LL long long #define INF 0x3f3f3f3f int main() { int v,a[1

codeforces 343C Read Time 二分 + 贪心

http://codeforces.com/problemset/problem/343/C 题意: 有一些磁头,给出了起始的位置,给出了一些磁盘中需要访问的地点.求这些磁头移动的最小的次数. 思路: 二分找出满足要求的最小的时间,对于当前尝试的时间进行贪心判断是否可用.对于贪心,因为每一个磁头都需要读到还没有人读过的最左边的地方.如果这个都不能满足,那么这个时间是不可以的. 在这基础上,对于同样的这么多时间,尽可能的让这个磁头读到能读到的最右边,这样就可以将还没有读过的地方尽可能的往右推. 如