POJ 1118,2606,2780,3512

来源:互联网 发布:js 深度克隆 编辑:程序博客网 时间:2024/06/02 01:42

    四题题意都是问一个平面上很多离散点,问一条直线最多能串起几条,作为糖葫芦控毫无压力呀喵哈哈~买一送三的题当然做了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 100000000using 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;elsek=(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

原创粉丝点击