L3-012 水果忍者

解题思路:见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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值