思路:算是枚举吧,把纵坐标y用数组存起来,然后排序,去重,这样形成了很多条平行于x轴的线,然后枚举没两条线的组合,即矩形的两条平行的边,计算平行于y轴的每条线的权值,然后cmp(()函数求ans.
学习cmp()函数的用法
注:1.用vector<point>p比point p[1200]快
2.对p sort排序快一些,不排序对结果没有影响。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#define MAXN 1210
using namespace std;
struct point
{
int x,y,val;
int operator <(const point &p) const
{
return y<p.y;
}
point(int a,int b,int c)
{
x=a;
y=b;
val=c;
}
};
vector<point>p;
int cas,n,k,minn,maxx,ans, y[MAXN],x[MAXN];
void cmp(int a,int b)
{
int w=y[b]-y[a];
int l,r;
l=r=minn;
int cur=x[minn];
while(r<=maxx)
{
if(cur>=k)
{
ans=min(ans,w*(r-l));
cur-=x[l];
l++;
}
else
{
r++;
cur+=x[r];
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&k);
maxx=0;
minn=0x7fffffff;
p.clear();
for(int i=0; i<n; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
y[i]=b;
minn=min(minn,a);
maxx=max(maxx,a);
p.push_back(point(a,b,c));
}
//sort(p.begin(),p.end());
sort(y,y+n);
int len=unique(y,y+n)-y;
if(len==1)
{
printf("0\n");
continue;
}
ans=0x7fffffff;
for(int i=0; i<len; i++)
{
for(int j=i+1; j<len; j++)
{
memset(x,0,sizeof(x));
for(int k=0; k<n; k++)
{
if(p[k].y>=y[i]&&p[k].y<=y[j])
{
x[p[k].x]+=p[k].val;
}
}
cmp(i,j);
}
}
printf("%d\n",ans);
}
return 0;
}