EOJ 3263 丽娃河的狼人传说 题解

题意

丽娃河是华师大著名的风景线。但由于学校财政紧缺,丽娃河边的路灯年久失修,一到晚上就会出现走在河边要打着手电的情况,不仅非常不方便,而且影响安全:已经发生了大大小小的事故多起。
方便起见,丽娃河可以看成是从 1 到 n 的一条数轴。为了美观,路灯只能安装在整数点上,每个整数点只能安装一盏路灯。经专业勘测,有 m 个区间特别容易发生事故,所以至少要安装一定数量的路灯,
请问至少还要安装多少路灯。

思路

贪心,先对区间按右端点排序,然后每一次考虑安装新的路灯时,先统计该区间内已有的数量,如果不足再从右往左安装,如果一个区间内需要的最少数量超过了区间长度,那么就是无解的

代码

#include 
#include 
using namespace std;
typedef struct block
{
    int l;
    int r;
    int t;
}block;
bool cmp(block a,block b)
{
    if(a.r!=b.r)
        return a.rif(a.l!=b.l)
        return a.lreturn a.tbool light[1001];
block b[1001];
int main()
{
    int T,n,m,k,x,ans,cnt,f;
    scanf("%d",&T);
    for(int kase=1;kase<=T;kase++)
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;iscanf("%d",&x);
            light[x]=true;
        }
        for(int i=0;iscanf("%d%d%d",&b[i].l,&b[i].r,&b[i].t);
        printf("Case %d: ",kase);
        sort(b,b+m,cmp);
        ans=0;
        f=0;
        for(int i=0;i0;
            for(int j=b[i].r;j>=b[i].l;j--)
                if(light[j])
                    cnt++;
            if(cnt>=b[i].t)
                continue;
            if(b[i].r-b[i].l+11;
                break;
            }
            for(int j=b[i].r;j>=b[i].l;j--)
            {
                if(cnt==b[i].t)
                    break;
                if(!light[j])
                {
                    light[j]=true;
                    cnt++;
                    ans++;
                }
            }
        }
        if(f==1)
            printf("-1\n");
        else printf("%d\n",ans);
        for(int i=1;i<=n;i++)
            light[i]=false;
    }
    return 0;
}

你可能感兴趣的:(EOJ)