HDU 5020 容器標記斜率

題意:給你n個點,讓你求出三點共線的最大情況,   點數爲1000個

題解:很顯然 ,點數1000,普通枚舉O(n3),肯定過不了了。

方法爲map記錄每個點和其他點連線的斜率,如果斜率出現次數大於2 ,Num += C(N,2);

代碼:

#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;
map<double , int> mark;
int flag;
struct Node
{
   int x, y;       
}cun[1005];
void slove(Node a, Node b)
{
   if (a.x == b.x)  {flag ++ ;return ;}
   double k =(1.0 * (a.y - b.y)) / (1.0 * (a.x - b.x));  
   mark[k] ++;
   return ;   
}
int slov(int a)
{
   int k = a * (a-1) / 2;
   return  k;       
} 
int main()
{
    int t, n;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d", &n);
       mark.clear();
       for(int i = 0; i < n; i++)
       {
         scanf("%d%d", &cun[i].x, &cun[i].y);        
       }
       __int64 num = 0;
       flag = 0;
       for(int i = 0; i < n; i++)
       {
         for(int j = i+1; j < n; j++)
         {
            slove (cun[i], cun[j]);    
         }  
         map<double, int>::iterator my_Itr;
         for(my_Itr=mark.begin();my_Itr!=mark.end();++my_Itr)
         {
            int k = my_Itr->second;
            if(k >= 2) 
              num += slov(k);
         }     
         if(flag >= 2)
         num += slov(flag);
         flag = 0;
         mark.clear();
       }  
       printf("%I64d\n", num);      
    }   
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章