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);
    }
}
时间: 2024-08-07 17:19:21

HDU 5020 容器标记斜率的相关文章

HDU 3507 Print Article 斜率优化

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 4810    Accepted Submission(s): 1451 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique

HDU 3507 单调队列 斜率优化

斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方法来做,但是该题要求的是区间和的平方,于是要转换单调的计算方法为斜率,也就是凸线. 其他就是最基本的单调DP /** @Date : 2017-09-04 15:39:05 * @FileName: HDU 3507 单调队列 斜率优化 DP.cpp * @Platform: Windows * @

hdu 3480 Division (斜率优化)

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 2676    Accepted Submission(s): 1056 Problem Description Little D is really interested in the theorem of sets recently. There's a pro

hdu 3045 Picnic Cows(斜率优化DP)

题目链接:hdu 3045 Picnic Cows 题意: 有n个奶牛分别有对应的兴趣值,现在对奶牛分组,每组成员不少于t, 在每组中所有的成员兴趣值要减少到一致,问总共最少需要减少的兴趣值是多少. 题解: 分析:先对n个数进行排序,则可以分析出分组成员一定是连续的 dp[i]表示前i个数得到的最少值则:从j~i作为一组 dp[i]=dp[j-1]+sum[i]-sum[j-1]-(i-j+1)*s[j];//sum[i]表示前i个数的和=>dp[i]=dp[j-1]+sum[i]-sum[j-

HDU 3480 Division(斜率DP裸题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3480 题目大意:将n个数字分成m段,每段价值为(该段最大值-该段最小值)^2,求最小的总价值. 解题思路:很单纯的斜率优化DP,得出状态转移方程:dp[i][j]=min{dp[k][j-1]+(a[i]-a[k+1])^2}(j-1<=k<i),然后斜率优化降到O(n^2)就好了. 注意:数据类型建议用int,不要用long long,后者乘法计算时间是前者的四倍,否则C++可能会超时. 代码:

HDU 3480 Division(斜率优化+二维DP)

Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others) Total Submission(s): 3984    Accepted Submission(s): 1527 Problem Description Little D is really interested in the theorem of sets recently. There’s a pro

hdu 1242 不用标记数组的深搜

#include<stdio.h>#include<string.h>char mapp[220][220];int m,n,mmin;void dfs(int x,int y,int time){  if(mapp[x][y]=='#'){   return ;  }  if(x<0||x>=m||y<0||y>=n){   return ;  }  if(mapp[x][y]=='a'){         dfs(x,y+1,0);         df

HDU 3507 Print Article (斜率DP)

题意:要输出N个数字a[N],输出的时候可以连续连续的输出,每连续输出一串,它的费用是 "这串数字和的平方加上一个常数M". 析:这个题很容易想到DP方程dp[i] = min{dp[j] + M + (sum[i]-sum[j])^2},但是很明显是O(n^2),TLE是必然的,所以要进行优化. 假设 i > j > k ,并且 j 要比 k 好,那么就是 dp[j] + M + (sum[i]-sum[j])^2 < dp[k] + M + (sum[i]-sum

HDU 2829 Lawrence (斜率DP)

斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k]+cost[k+1][i]+sum[k]*(sum[i]-sum[k]) cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k]) 代入DP方程 可以得出 y=dp[k][j-1]-cost[1][k]+sum[k]^2 x=sum[k]. 斜率s