首页 > 其他分享 >平行四边形 题解

平行四边形 题解

时间:2024-07-31 18:05:56浏览次数:6  
标签:题解 线段 大大 斜率 平行四边形 数学课 define

题目id:20306

题目描述

鱼大大凭借着优秀的语文成绩当上了数学课代表?!鱼大大心想着数学和我语文好也不搭边呀,不过他的数学老师疯狂给鱼大大画饼:只要你当了数学课代表,有很多很多权利的啦......最后数学老师告诉鱼大大,人只要一行行,行行行,这句话在学科上也是一样的,语文学的好,数学也一定能学好,并给鱼大大出了一道题目,只要能完成,就让鱼大大继续当数学课代表:
在平面直角坐标系上,给出了\(n\)条线段,知道每条线段的两端点坐标,要鱼大大每次选择四条线段,使得这四条线段经过平移后的延长线能组成的平行四边形,问最多能组成多少个平行四边形?鱼大大接受了数学老师画饼行为,并为了保住数学课代表职位疯狂学习,只为了解出最多能有多少个平行四边形。
注:选过的线段不可再选,且保证除去与坐标轴平行的线段的斜率为整数。保证没有两端点相同的线段。

解题思路

在开始之前,我们需要知道斜率怎么求。
假设线段\(l\)的两个端点的坐标为\(\left(x1,y1\right)\)和\(\left(x2,y2\right)\),那线段\(l\)的斜率为\(\frac{y2-y1}{x2-x1}\)。特别地,对于\(x1=x2\)的情况,该线段\(l\)的斜率为\(\infty\)。
这题是一道贪心题,我们把每次斜率最多的线段数量\(x\)和斜率次多的线段数量\(y\)取出,那么这两条线段可以产生\(y\)个平行四边形\((\)因为\(x\)比\(y\)多而\(2\)对\(\left(x,y\right)\)可以组成一个平行四边形\()\),加完答案后将剩的\(x-y\)条线段添加。
因为该题每次取出的是最大值,所以我们用优先队列\((\)大根堆\()\)存储。
priority_queue<int,vector<int>,less<int>>q;
再配合map存储即可。

AC Code

#include<bits/stdc++.h>
#define N 1000007
#define INF 1e18
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define IOS ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
ll n,ans;
priority_queue<ll,vector<ll>,less<ll>>p;
map<ll,ll>mp;
int main()
{
    IOS,cin>>n;
    for(ll i=1,a,b,c,d;i<=n;++i)
    {
        cin>>a>>b>>c>>d;
        if(a!=c)
            ++mp[(d-b)/(c-a)];
        else 
            ++mp[INF];
    }
    for(auto it:mp)
        p.push(it.second/2);
    while(p.size()>=2)
    {
        int x=p.top();
        p.pop();
        int y=p.top();
        p.pop();
        ans+=y;
        p.push(x-y);
    }
    cout<<ans;
    return 0;
}

标签:题解,线段,大大,斜率,平行四边形,数学课,define
From: https://www.cnblogs.com/988176-/p/18335168

相关文章

  • 数字检测 题解
    题目id:20317题目描述作为一个学渣的鱼大大在学习了进制数之后,经常会写错进制数,导致他在做题的时候经常出现,写到了最后发现数字是错的情况,非常浪费时间。所以他迫切地想要一位大聪明随时随刻能帮他检测一下他写的\(n\)进制数到底是不是对的。现在鱼大大给出了一个\(n\)进制的数\(......
  • 题解_P2024 [NOI2001] 食物链
    [NOI2001]食物链题目描述动物王国中有三类动物\(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\)。现有\(N\)个动物,以\(1\simN\)编号。每个动物都是\(A,B,C\)中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这......
  • 20240731题解
    这么简单的题目没有AK(计时器(timer)题目:每次可以加上\(2^n-1\),问多少次变成\(x\)题解:因为较大的数大于较小的数的两倍,直接贪心的选最大的即可。复杂度\(\Theta(T\logn)\)代码:#include<cstdio>#defineintlonglongconstintN=105,A=1000000000000000000;intT,x,f[N......
  • P4784 城市 题解 / 最小斯坦纳树
    P4784城市题解题目大意给定\(n\)个节点,\(m\)条带边权边,和\(k\)重要节点。选择一些边,使得这些边能让这\(k\)个节点连通,代价为选出的边权和。求最小代价。(\(k\leq5\))Solve前置芝士:斯坦纳树。定义将指定点集合(部分点)中的所有点连通,且边权总和最小的生成树称为最小斯坦......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • ARC180 部分简要题解
    C设\(f_{i,j}\)为考虑前\(i\)个数,当前选出来的子序列和为\(j\)且强制最后一个选出来的数不为\(j\)的方案;设\(g_{i,j}\)为考虑前\(i\)个数,当前选出来的子序列和为\(j\)且强制最后一个选出来的数必为\(j\)的方案。注意到一个合法方案可以唯一与一个最后一个选出......
  • P10814 【模板】离线二维数点 题解
    题目传送门思路一眼主席树板子题,但是一看数据范围\(n,m\le2\times10^6\),似了。在线做法应该是似完了,考虑离线做法。我们知道树状数组是可以做二维偏序的,大家应该都知道一个经典问题:对于一个序列,多次询问下标\(\lea\)且数值\(\leb\)的数的个数。回到这道题,相比上面......
  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目传送门题目大意:在一个平面直角坐标系上,给定\(n\)个点的坐标\((x,y)\),\(m\)次询问,每次询问一个矩形范围内的点的数量,此矩形用\(\{a,b,c,d\}\)来描述,其中\((a,b)\)为左下角,\((c,d)\)为右上角。思路:不难将题目转化为:给定一个长度为\(n\)的序列,序列中的每个元......
  • CF1997(edu168)题解 A-F
    A.StrongPassword注意到最大效果是在两个相同字符之间插入一个不同的,贡献为3。否则在一开始插入一个和首位不同的,贡献为2。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){strings;cin>>s;boolok=0;for(inti......
  • 【题解】2024牛客多校第5场
    E安https://ac.nowcoder.com/acm/contest/81600/E分析简单博弈/思维题。当ai>bi时,当前骑士一定存活。当ai<bi时,当前骑士一定死亡。为了使得自己存活的骑士尽可能多,若存在ai=bi的情况,一定会选择令该骑士去攻击对方,并且双方均会轮流优先选择此类骑士。......