解题思路:见https://blog.csdn.net/foreyes_1001/article/details/52208749
讲道理这是我做的PAT中做的最最心累的一道题了,没有之一,到现在还不知道哪里有问题。这份代码我认为没有错误了,但是还有一个点过不了,而且最后那个点还随最后一句printf("%d %d %d %d\n",s[st].x,s[st].yl,s[mat].x,s[mat].yh);中mat还是mit变化为第四个点错还是第二个点错。我目前只好认为可能最后那个判题程序会不会也存在bug.
过了一段时间重新做了一下,发现对了。见第二段代码。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
int x,yl,yh;
node(){
}
}s[20009];
struct L
{
int x,y;
L(){
}
L(int x,int y):x(x),y(y){
}
}p[10009];
int inf=100000000;
int cross(L a, L b) //a X b 返回1说明b斜率大,-1a斜率大,0说明a,b重合
{
ll temp = (ll)(a.x)*(ll)(b.y) - (ll)(a.y)*(ll)(b.x);
if (temp > 0) return 1;
else if (temp == 0) return 0;
return -1;
}
bool cmp(node a,node b)
{
return a.x<b.x;
}
bool cmp2(L a,L b)
{
return a.y<b.y;
}
int main()
{
//freopen("t.txt","r",stdin);
int n,a,b,c;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
s[i].x=a;
s[i].yh=b;
s[i].yl=c;
}
if(n==1)//需要单独考虑只有一个的情况
{
printf("%d %d %d %d",s[0].x,s[0].yl,s[0].x,s[0].yh);
return 0;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
p[i].x=i;
p[i].y=s[i].yh-s[i].yl;
}
sort(p,p+n,cmp2);
int mat=0,mit=0,st;
L ma,mi;
for(int k=0;k<n;k++)
{
int j=p[k].x;
ma=L(0,1);
mi=L(0,-1);
for(int i=0;i<=j-1;i++)
{
L v1=L(s[j].x-s[i].x,s[j].yl-s[i].yl);
L v2=L(s[j].x-s[i].x,s[j].yl-s[i].yh);
if(cross(ma,v1)<0)
{
ma=v1;
mat=i;
}
if(cross(mi,v2)>0)
{
mi=v2;
mit=i;
}
}
for(int i=j+1;i<n;i++)
{
L v1=L(s[i].x-s[j].x,s[i].yh-s[j].yl);
L v2=L(s[i].x-s[j].x,s[i].yl-s[j].yl);
if(cross(ma,v1)<0)
{
ma=v1;
mat=i;
}
if(cross(mi,v2)>0)
{
mi=v2;
mit=i;
}
}
if(cross(ma,mi)<=0)
{
st=j;
break;
}
}
printf("%d %d %d %d\n",s[st].x,s[st].yl,s[mat].x,s[mat].yh);
return 0;
}
过了一段时间再来做,发现竟然对了
#include<bits/stdc++.h>
#define N 10009
#define ll long long
using namespace std;
struct node
{
int x,h,l;
}s[N];
struct node2
{
int x,y;
node2(){
}
node2(int x,int y):x(x),y(y){
}
ll det(node2 b)
{
return (ll)x*(ll)b.y-(ll)b.x*(ll)y;
}
};
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
//freopen("t.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&s[i].x,&s[i].h,&s[i].l);
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
node2 t1=node2(0,-1),t2=node2(0,1),tp;
for(int j=0;j<=i-1;j++)
{
tp=node2(s[i].x-s[j].x,s[i].l-s[j].l);
if(t2.det(tp)<0)
{
t2=tp;
}
tp=node2(s[i].x-s[j].x,s[i].l-s[j].h);
if(t1.det(tp)>0)
{
t1=tp;
}
}
for(int j=i+1;j<n;j++)
{
tp=node2(s[j].x-s[i].x,s[j].l-s[i].l);
if(t1.det(tp)>0)
{
t1=tp;
}
tp=node2(s[j].x-s[i].x,s[j].h-s[i].l);
if(t2.det(tp)<0)
{
t2=tp;
}
}
if(t1.det(t2)>=0)
{
printf("%d %d %d %d\n",s[i].x,s[i].l,s[i].x+t2.x,s[i].l+t2.y);
break;
}
}
return 0;
}