https://vjudge.net/contest/426531#problem/L
拆墙问题
给一个长宽为n+1,n+1的面积,再给一组坐标,代表左右端点,在这一区间内按上一堵墙,杂技人员只能穿过k堵墙,问最少需要删除多少堵墙,才能使全部穿过。
一开始是没有思路的,参考了别人的想法,
有很多人写的比较麻烦,不得不说,这个聪明又简单👍🏻,那我现在就对这个题解夸赞一下吧
整体思路是从左边的需要拆墙的位置开始,然后比较右端最远的,这样才能删除的最长
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct dot
{
int x1,y1,x2,y2;
}d[10005];
int main()
{
int t;
cin >> t;
while(t--)
{
int n,k,max,m,sum=0;
int a[1005]={0},b[1005];
cin >> n>>k;
int p=0;
for(int i=0;i<n;i++)
{
cin >> d[i].x1>>d[i].y1;
cin >> d[i].x2>>d[i].y2;
if(d[i].x1>d[i].x2) swap(d[i].x1,d[i].x2);
}
int c;
for(int i=0;i<=100;i++)
{//把要求范围内的行坐标都遍历一遍
//可以在输入的时候记录下最大值,这里可以把100改为最大值
c=0;
for(int j=0;j<n;j++)
{
if(i<=d[j].x2&&i>=d[j].x1) c++;//全部遍历一遍,记录这一行数的最大值
}
if(c<=k) continue;
while(c>k)
{
max=-1;
for(int j=0;j<n;j++)
{
if(i<=d[j].x2&&i>=d[j].x1&&max<d[j].x2)
{
m=j;
max=d[j].x2;//记录右端点的最大值
}
}
d[m].x2=-1;//把最大的右端点改值,这样在下次循环的时候直接略过
sum++;
c--;
}
}
cout << sum << endl;
}
return 0;
}