题目链接:http://poj.org/problem?id=1230
贪心策略是遍历每列,把不合格的列中往右延申最长的墙去掉。
但是做完这道题发现自己总是需要比较大的空间复杂度呀,不太好。。
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct Wall{
int r,c1,c2;
}wall[101];
vector<int> c[101];
int wall_count[101];
int wall_mark[101];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(wall_mark,0,sizeof(wall_mark));
memset(wall_count,0,sizeof(wall_count));
for(int i=0;i<=100;i++)
c[i].clear();
int n,k;
scanf("%d%d",&n,&k);
int maxy=0;
for(int i=0;i<n;i++)
{
int c1,c2,r1,r2;
scanf("%d%d%d%d",&c1,&r1,&c2,&r2);
if(c1>c2)
{
int tmp=c1;
c1=c2;
c2=tmp;
}
if(c2>maxy)
maxy=c2;
wall[i].r=r1;
wall[i].c1=c1;
wall[i].c2=c2;
for(int j=c1;j<=c2;j++)
{
c[j].push_back(i);
wall_count[j]++;
}
wall_mark[i]=1;
}
int ans=0;
for(int j=0;j<=maxy;j++)
{
while(wall_count[j]>k)
{
int flag;
int sum=0;
for(int x=0;x<c[j].size();x++)
{
if(wall[c[j][x]].c2>=sum&&wall_mark[c[j][x]]>0)
{
flag=c[j][x];
sum=wall[c[j][x]].c2;
}
}
wall_mark[flag]=0;
for(int x=wall[flag].c1;x<=wall[flag].c2;x++)
{
wall_count[x]--;
}
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}