51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)

题目:

这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路。

第4次用斜率去重一次就过了。

注意:n定义成long long,不然求C(3,n)时会溢出。

代码:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll;

struct point{
    int x;int y;
}a[2005];

map <long double,int>::iterator it;
int main() {
    ll n;
    cin >> n;
    for(int i = 0; i < n; ++i){
        cin >> a[i].x >> a[i].y;
    }

    int exp = 0; //表示重复的数量
    for(int i = 0;i < n; ++i){
        map <long double,int> m;//long double表示斜率,int表示数量,定义在这里是为了清空map。
        for(int j = i+1;j < n; ++j){

            long double x = a[i].x-a[j].x;
            long double y = a[i].y-a[j].y;
            if(x == 0){
                m[10000000]++;  //10000000表示斜率不存在
            }else {
                m[y/x]++;
            }
        }
        for(it = m.begin();it != m.end(); ++it){
            if(it->second > 1){
                exp += it->second*(it->second-1)/2; // 斜率去重 C(2,it-second)。
            }
        }
    }
    cout << n*(n-1)*(n-2)/6 - exp << endl;  // C(3,n)-exp
    return 0;
}
//writed by zhangjiuding.
时间: 2024-10-13 00:20:01

51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)的相关文章

51Nod 1002 数字三角形 Label:水水水 &amp;&amp; 非学习区警告

一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上. 5 8 4 3 6 9 7 2 9 5 例子中的最优方案是:5 + 8 + 6 + 9 = 28 Input 第1行:N,N为数塔的高度.(2 <= N <= 500) 第2 - N + 1行:每行包括1层数塔的数字,第2行1个数,第3行2个数......第k+1行k个数.数与数之间用空格分隔(0 <= A[i] <= 10^5

51nod 1315 合法整数集 (位操作理解、模拟、进制转换)

1315 合法整数集 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,...,an-1,那么定义:Fun(A)=a0 or a1 or ... or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在

51Nod 圆与三角形

给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). Input 第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据. 4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R.(-3000 <= xc, yc <= 3000, 1 <= R <= 3000) 4-2:2个数,三角形第1个点的

51Nod 1315 合法整数集

一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,...,an-1,那么定义:Fun(A)=a0 or a1 or ... or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在给你一个集合Y与整数X的值,问在集合Y至少删除多少个元素能使集合Y合法? 例如:Y = {1,2,4},X=7:显然现在的Y不合法,因为 1 or 2 or

LeetCode 287. Find the Duplicate Number (python 判断环,时间复杂度O(n))

LeetCode 287. Find the Duplicate Number 暴力解法 时间 O(nlog(n)),空间O(n),按题目中Note"只用O(1)的空间",照理是过不了的,但是可能判题并没有卡空间复杂度,所以也能AC. class Solution: # 基本思路为,将第一次出现的数字 def findDuplicate(self, nums: List[int]) -> int: s = set() for i in nums: a = i in s if a

51nod 1791 合法括号子段

[题解] 我们可以发现每一对可以匹配的左右括号一定是一一对应的,那么我们用一个栈维护即可.如果当前是右括号,栈顶是左括号,那么一定有1的贡献,还要加上之前到达过top-1这个位置多少次,因为现在这一对括号可以和之前的那些组成更长的序列. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define N 2200010 6 #define rg r

CareerCup之1.3字符串去重

[题目] 原文: 1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not. FOLLOW UP Write the test cases for

数三角形 bzoj 1201

数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且平行于三角形的第三边的线段分成了n2个单位等边三角形(边长为1).下图左是n=5的情形: 小苏想知道,删除其中的一些短边后,剩下的边一共组成多少个三角形(包括所有边长为m的三角形),正立的和倒立的都算,只要三角形的3m条短边都没有被删除就算是组成一个三角形).例如,上图右就存在19个三角形. [输入

火眼金睛算法,教你海量短文本场景下去重

本文由QQ大数据发表 最朴素的做法 在大多数情况下,大量的重复文本一般不会是什么好事情,比如互相抄袭的新闻,群发的垃圾短信,铺天盖地的广告文案等,这些都会造成网络内容的同质化并加重数据库的存储负担,更糟糕的是降低了文本内容的质量.因此需要一种准确而高效率的文本去重算法.而最朴素的做法就是将所有文本进行两两比较,简单易理解,最符合人类的直觉,对于少量文本来说,实现起来也很方便,但是对于海量文本来说,这明显是行不通的,因为它的时间复杂度是,针对亿级别的文本去重时,时间消耗可能就要以年为单位,此路不通