题意
中文题,不解释
题解
一道有关贪心的水题,题解说O(N^2)就可以过。首先可以对右端点进行排序,然后对于每个区间,从右到左放灯,这样的话必然是最优解。
注意事项
注意无解的情况,此时要输出-1
代码
#include <bits/stdc++.h>
#define MAXN 1010
using namespace std;
struct Node{
int l,r,num;
};
int cmp(Node a,Node b){
return a.r<b.r;
}
int used[MAXN];
Node nod[MAXN];
int main()
{
int kase;
scanf("%d",&kase);
int ks=1;
while(kase--){
memset(used,false,sizeof(used));
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;i++){
int x;
scanf("%d",&x);
used[x]=true;
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&nod[i].l,&nod[i].r,&nod[i].num);
}
sort(nod,nod+m,cmp);
int ans=0;
bool flag=false;
for(int i=0;i<m;i++){
int p=0;
for(int j=nod[i].r;j>=nod[i].l;j--){
if(used[j])
p++;
}
for(int j=nod[i].r;j>=nod[i].l;j--){
if(p>=nod[i].num){
break;
}
if(used[j]){
continue;
}else if(p<nod[i].num){
p++;
ans++;
used[j]=true;
continue;
}
}
if(p<nod[i].num){
flag=true;
}
}
if(flag){
printf("Case %d: -1\n",ks++);
}else{
printf("Case %d: %d\n",ks++,ans);
}
}
return 0;
}