POJ 1230 Pass-Muraille#贪心+vector迭代器用法

时间:2023-11-09 17:48:56

(~ ̄▽ ̄)~*

(注意下面代码中关于iterator的用法,此代码借鉴某大牛)

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std; struct Wall
{
int row;//表示墙在哪行
int left;
int right;
}; int col[105];//保存每列的墙数
vector<Wall> wall; int main()
{
int t,n,k,ax,ay,bx,by;
scanf("%d",&t);
while(t--)
{
wall.clear();
memset(col,0,sizeof(col));
scanf("%d%d",&n,&k);
int maxright=0;
int cnt=0;
while(n--)
{
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
if(ax>bx)
swap(ax,bx);//有可能先输入墙的右端点
if(bx>maxright)
maxright=bx; Wall temp;
temp.row=ay; temp.left=ax; temp.right=bx;
wall.push_back(temp);
for(int i=ax;i<=bx;i++)
col[i]++;
}
int maxt;
for(int i=0;i<=maxright;i++)
{//前面maxright记录了所有墙中的最右端,这样遍历的时候,在maxright结束即可
while(col[i]>k)
{//遍历每列,当该列的墙数>k,说明需要删墙了
vector<Wall>::iterator it=wall.begin();//遍历迭代器
vector<Wall>::iterator iter;//临时迭代器
maxt=0;
while(it!=wall.end())
{//把右边界最大(right大于maxt)的墙(用iter记录)删掉(erase vector元素wall中的第iter个元素)
if((*it).left<=i)
{
if((*it).right>maxt)
{
maxt=(*it).right;
iter=it;
}
}
it++;
}
for(int j=(*iter).left;j<=(*iter).right;j++)
col[j]--;//删掉墙相关的记录
wall.erase(iter);//删掉墙
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}