炒鸡明显的贪心题,主要就想让一段区间与另一段里面重合的数越多越好。
于是先按照区间右端排序,然后尽可能的把数都往右靠拢,最后与另一段区间的前面的重合。。
然后可以用个flag来记录哪些数被选了什么的。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000,maxl=1000;
int n,ans;
struct node
{
int l,r,c;
}line[maxn+1];
bool flag[maxl+1];
bool comp(node a,node b)
{
return a.r<b.r;
}
void read()
{
int i,j;
std::ios::sync_with_stdio(false);
cin>>n;
for(i=1; i<=n; i++)
cin>>line[i].l>>line[i].r>>line[i].c;
sort(line+1,line+n+1,comp);
for(i=1; i<=n; i++)
{
for(j=line[i].l; j<=line[i].r; j++)
if(flag[j]==true)
line[i].c--;
j=line[i].r;
while(line[i].c>0)
{
if(flag[j]==false)
{
flag[j]=true;
line[i].c--;
}
j--;
}
}
for(i=0; i<=line[n].r; i++)
if(flag[i]==true)
ans++;
cout<<ans;
return;
}
int main()
{
read();
return 0;
}
AC代码。