POJ 3512-Incidental Points 要选择合适的算法,否则容易超时

POJ 3512-Incidental Points 要选择合适的算法,否则容易超时

这道题可以算是1118,2780的升级版,因为更容易超时了 O(∩_∩)O~
题目的意思很简单,给你许多点,然后让你求出在同在一条直线上的点最多有多少个。
这道题做了2个小时,开始用了暴搜的方法(那个方法不用考虑斜率不存在的情况),超时了,汗~后来改成计算斜率的方法才过的 方法如下:
单独考虑斜率不存在的情况,把所有的点按照x的大小排序,算出x相同的点最多有多少个,保存到max1里;
然后考虑斜率存在的情况,考虑一个定点,把它和其它直线的斜率都算出来,排序,然后再计算相同的斜率最多有多少个,每个点都这样算一遍,取最大值中的最大值,存在max2中;
最后比较max1和max2+1(注意max2我们是用斜率算的,它代表max2+1个点)取较大值输出即可;

#include < iostream >
#include
< cmath >
#include
< cstdio >
#include
< algorithm >
using   namespace  std;

struct  node  {
    
int x;
    
int y;
}
set [ 1001 ];

int  cmp( const   void   * a, const   void   * b)
{

    
struct node*c=(node *)a;
    
struct node*d=(node* )b;
    
return c->x-d->x;
}


char  temp[ 100 ];
double  slope[ 10001 ];


int  main ()

{

    
int n;
    
int i,j,k;
    
int testcase;
    testcase
=0;
    
int max1;
    
int max2;
    
int pos;
    
int tempmax2;
    
for(testcase=1;;testcase++)
    
{

        pos
=0;
        
while(gets(temp))
        
{

            
if(temp[0]=='-'&&temp[1]=='-')
                
break;
            pos
++;
            sscanf(temp,
"%d%d",&set[pos].x,&set[pos].y);
        }

        n
=pos;
        
if(n==0)
            
break;
        
int tempmax=1;
        max1
=0;
        qsort(
set+1,n,sizeof(set[1]),cmp);
        
for(i=2;i<=n;i++)
        
{
            
if(set[i].x!=set[i-1].x)
                tempmax
=1;
            
else
                tempmax
++;
            
if(tempmax>max1)
                max1
=tempmax;
        }

        max2
=0;
        
for(i=1;i<=n;i++)
        
{
            pos
=0;
            
for(j=1;j<=n;j++)
            
{

                
if(i!=j&&set[i].x!=set[j].x)
                
{
                    pos
++;
                    slope[pos]
=((double)set[j].y-set[i].y)/((double)set[j].x-set[i].x);

                }

            }

            sort(slope
+1,slope+1+pos);
            tempmax
=1;
            
            tempmax2
=0;
            
for(j=2;j<=pos;j++)
            
{
                

                
if(slope[j]!=slope[j-1])
                    tempmax
=1;
                
else
                    tempmax
++;
                
if(tempmax>tempmax2)
                    tempmax2
=tempmax;
            }

            
if(tempmax2>max2)
                max2
=tempmax2;
        }

        
if(max1>max2)
            printf(
"%d. %d\n",testcase,max1);
        
else
            printf(
"%d. %d\n",testcase,max2+1);

        }


    
return 0;
}


你可能感兴趣的:(POJ 3512-Incidental Points 要选择合适的算法,否则容易超时)