POJ 1118,2606,2780,3512

    四题题意都是问一个平面上很多离散点,问一条直线最多能串起几条,作为糖葫芦控毫无压力呀喵哈哈~买一送三的题当然做了OTZ…区别貌似就是2780说明没有重点;2606坐标有负数,没重点;3512是升级版数据量大一点,input格式不一样;OTZ,用同一段代码交过了,呐~莫名其妙的心虚的感觉呀喵哈哈~

    做法也不难想到,枚举每两个点之间连线段的斜率,对斜率排序,数数对于同一个点斜率相等的线段最多的个数,就可以了。需要处理斜率垂直于x轴的直线,我还处理了重(chong,二声)点,可是貌似数据里没有重点OTZ…

    代码如下:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define LL __int64
#define eps 1e-8
#define inf 100000000
using namespace std;

LL ans,n,tmp,mm,ch[1005],x[1005],y[1005];
double now,na[1005][1005];
int main()
{
 	
	while(EOF!=(scanf("%I64d",&n)) && n)
	{
        memset(ch,0,sizeof(ch));
		memset(na,0,sizeof(na));
		for(LL i=0;i<n;i++)
			scanf("%I64d%I64d",&x[i],&y[i]);
		for(LL i=0;i<n;i++){
			for(LL j=0;j<n;j++){
				double k;
				if(x[i]==x[j] && y[i]==y[j])
		            k=inf+1;
				else if(x[i]==x[j]) 
					k=inf;
				else
					k=(double)(y[j]-y[i])/(double)(x[j]-x[i]);
				na[i][j]=k;
				//printf("%.16lf  ",na[i][j]);           //na记录斜率,inf是垂直于x轴,inf+1是重点,为了排序后排在最后的
			}
			//printf("\n");
		}
		for(LL i=0;i<n;i++) 
			sort(&na[i][0],&na[i][n]);
		ans=0;
		for(LL i=0;i<n;i++){
			mm=0;
			tmp=1;
			now=na[i][0];                            
			for(LL j=1;j<n;j++){
			    if(fabs(na[i][j]-(inf+1))<eps){
			        ch[i]++;
				}
				else if(fabs(na[i][j]-now)<eps)
			        tmp++;
				else {
 		   		    now=na[i][j];
					mm=max(mm,tmp);
					tmp=1;
				}
			}
			mm=max(mm,tmp);
			ans=max(mm+ch[i],ans);
		}
		printf("%I64d\n",ans);
	}
	return 0;
}

   

    1.学习了sscanf的用法,从字符串中读入内容,可以是数或者子串等等。

for(n=0;;n++){
  	gets(s);
  	if(s[0]=='-'&&s[1]=='-') break;
  	sscanf(s,"%d%d",&x[n],&y[n]);
}
    2.调戏浮点数的技巧,判等,同一正负0的必不可少的eps,具体精度根据题目要求调整吧~


    很久没写代码了OTZ,很多脑残的地方处理不清晰,练起来吧~


另,昨天写的太滥了XDOJ交不过OTZ,又改了一会儿上三角矩阵版本OTZ,见下一篇XDOJ1008

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值