您的位置:首页 > 大数据 > 人工智能

POJ_1230_Pass-Muraille

2010-07-03 14:52 337 查看
///贪心,计算出每一列所能遇到的wall的数目,对于每一列,若wall数目小于k则判断下一列,否则
//对这列进行如下操作:找出起点不大于当前列而终点不小于当前列的墙,取其中终点减去当前列最大
//的那面墙,将其删去,(这里是贪心,即去掉对后面影响最大的墙),同时还要更新每一列的墙数
//num[i]的值。
#include<stdio.h>
#include<string.h>
int num[105],wall[105][4];
int n,k,ans;
int sort()
{
int i,j;
for(i=1;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(wall[j][0]>wall[j+1][0])
{
int t;
t=wall[j][0];wall[j][0]=wall[j+1][0];wall[j+1][0]=t;
t=wall[j][2];wall[j][2]=wall[j+1][2];wall[j+1][2]=t;
}
}
}
return 0;
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
memset(num,0,sizeof(num));
ans=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&wall[i][0],&wall[i][1],&wall[i][2],&wall[i][3]);
if(wall[i][0]>wall[i][2])
{
int temp;
temp=wall[i][0];
wall[i][0]=wall[i][2];
wall[i][2]=temp;
}
for(j=wall[i][0];j<=wall[i][2];j++)
num[j]++;
}
sort();
for(i=0;i<101;i++)
{
while(num[i]>k)
{
int max=-1,p;
for(j=0;j<n;j++)
{
if(wall[j][0]<=i&&wall[j][2]>=i&&wall[j][2]>max)
{
max=wall[j][2];
p=j;
}
if(wall[j][0]>i)
break;
}
for(j=wall[p][0];j<=wall[p][2];j++)
{
num[j]--;
}
wall[p][0]=0;wall[p][2]=0;ans++;
}
}
printf("%d/n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: