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