encu 3263 丽娃河的狼人传说

丽娃河是华师大著名的风景线。但由于学校财政紧缺,丽娃河边的路灯年久失修,一到晚上就会出现走在河边要打着手电的情况,不仅非常不方便,而且影响安全:已经发生了大大小小的事故多起。

方便起见,丽娃河可以看成是从 1 到 n 的一条数轴。为了美观,路灯只能安装在整数点上,每个整数点只能安装一盏路灯。经专业勘测,有 m 个区间特别容易发生事故,所以至少要安装一定数量的路灯,

请问至少还要安装多少路灯。

Input

第一行一个整数 T (1≤T≤300),表示测试数据组数。

对于每组数据:

第一行三个整数 n,m,k (1≤n≤103,1≤m≤103,1≤k≤n)。

第二行 k 个不同的整数用空格隔开,表示这些位置一开始就有路灯。

接下来 m 行表示约束条件。第 i 行三个整数 li,ri,ti 表示:第 i 个区间 [li,ri] 至少要安装 ti 盏路灯 (1≤li≤ri≤n,1≤ti≤n)。

Output

对于每组数据,输出 Case x: y。其中 x 表示测试数据编号(从 1 开始),y 表示至少要安装的路灯数目。如果无解,y 为 −1。

Examples
Input

3
5 1 3
1 3 5
2 3 2
5 2 3
1 3 5
2 3 2
3 5 3
5 2 3
1 3 5
2 3 2
4 5 1

Output

Case 1: 1
Case 2: 2
Case 3: 1

【分析】题目不难,前面如果选择了装灯,那么就尽量要对后面有影响,让后面尽量少安装,所以让右区间从左往右排序,让前一个区间尽量对后一个区间有影响。

【代码】

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct P
{
    int l,r,num;
};
P que[1005];//用来存放要求的条件
bool light[1005];//用来表示灯的状态,true为亮
bool cmp(P a,P b)
{
    if(a.r==b.r) return a.l>b.l;
    return a.rint main()
{
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    for(int x=1; x<=T; x++)
    {
        memset(que,0,sizeof(que));
        memset(light,false,sizeof(light));//多组输入,必须初始化
        printf("Case %d: ",x);
        int a,b,c,lig;
        scanf("%d%d%d",&a,&b,&c);
        for(int i=0; iscanf("%d",&lig);
            light[lig]=true;
        }
        bool can_or_not=false;//用来表示是否有些区间一定满足不了,这种情况直接输出-1
        for(int i=0; iscanf("%d%d%d",&que[i].l,&que[i].r,&que[i].num);
            if(que[i].num>que[i].r-que[i].l+1)
                can_or_not=true;
        }
        if(can_or_not)
        {
            printf("-1\n");
            continue;
        }
        sort(que,que+b,cmp);
        int ans=0;
        for(int i=0; i0;
            for(int j=que[i].l; j<=que[i].r; j++)
                if(light[j])
                    lig++;//统计区间灯的数量
            if(ligfor(int j=que[i].r;j>=que[i].l;j--)
                {
                    if(!light[j])//从右往左点亮灯
                    {
                        light[j]=true;
                        lig++;
                        ans++;//统计需要增加的灯的数量
                    }
                    if(lig==que[i].num)
                        break;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(encu,乱搞)