EOJ B. 杨柳依依

这是一篇关于EOJ B. 杨柳依依问题的博客,作者分析了题目的简单思路,分享了自己尝试解题过程中的困难,包括使用DFS而非题目要求的double。尽管代码不完美,但仍然得到了部分分数。作者反思了自身对知识掌握不熟练和码力不足的问题,并强调了熟练掌握数据结构的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

B. 杨柳依依

题目分析

第一眼看到这一题就觉得挺简单的(虽然我没有做出来 ),一个一个扫点标记,最后再统计就好了,然后正解也差不多在这里插入图片描述
但是本人码力实在是不足,然后写出以下代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long 
using namespace std;

const int maxn = 80050 ;
int n,m,a,b,k,l;
int cnt,h[maxn],vis[5050],dis[5050],ans=-1;

inline int readint()
{
   
	int x = 0 , f = 1 ; char c = getchar() ;
	while ( c > '9' || c < '0' ) {
    if ( c == '-' ) f = -1 ; c = getchar() ; }
	while ( c >= '0' && c <= '9' ) {
    x = x * 10 + c - '0' ; c = getchar() ; } 
	return f * x ;
}

struct node
{
   
	int next , to , val ;
}edg[maxn] ;

void add (int u , int v ,int val)
{
   
	++cnt ;
	edg[cnt].next = h[u] ;
	edg[cnt].to = v ;
	edg[cnt].val = val ;
	h[u] = cnt ;
}

void dfs ( int u )
{
   
	for ( int i = h[u] ; i ; i = edg[i].next )
	{
   
		int v = edg
### 关于EOJ中的极坐标排序算法实现 对于极坐标排序,在处理几何问题时经常遇到。通常情况下,极坐标排序涉及到将一系列点按照它们相对于某个固定点的角度大小进行排序。 在具体实现上,可以采用如下方式: 1. **计算角度** 对于每一个点 \((x, y)\),先将其转换成相对原点或者指定中心点的向量表示形式。接着利用反正切函数 `atan2` 来获取该点与正X轴之间的夹角。此操作能够确保即使当 \(y\) 值为负数也能得到正确方向上的角度[^1]。 ```cpp double angle = atan2(y - center_y, x - center_x); ``` 2. **自定义比较器** 接下来创建一个用于标准库 sort 函数的比较器来依据上述计算出来的角度对所有点进行升序排列。如果两个不同位置拥有相同角度,则可以根据距离远近进一步区分先后顺序。 3. **特殊情况考虑** 当存在多个点位于同一直线上时(即具有相等的角度),应该额外加入逻辑判断这些共线点间的前后关系,比如可以通过检测横纵坐标的差值来进行微调。 4. **代码实例** 下面给出一段简单的C++代码片段作为示范,展示了如何基于极坐标系下的角度完成一组二维平面上散乱分布的数据点按顺时针或逆时针方向有序化的过程: ```cpp #include <bits/stdc++.h> using namespace std; struct Point { double x, y; }; bool cmp(const Point &a, const Point &b){ // 计算两点到原点(或其他选定参照物)连线所形成的角度 double angA = atan2(a.y, a.x), angB = atan2(b.y, b.x); // 如果角度相等则根据离起点的距离决定次序 if (fabs(angA - angB) < 1e-9) return hypot(a.x,a.y)<hypot(b.x,b.y); // 否则直接对比角度大小 return angA<angB; } int main(){ vector<Point> points={{...}};//初始化数据集 // 调用sort并传入自定义cmp规则 sort(points.begin(),points.end(),cmp); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值