2017ACM-ICPC北京区域现场赛 G题 hihocoder1633

Zemax热分析实战:5分钟搞定双胶合透镜温度漂移优化(附操作数详解) 本文详细解析了使用Zemax进行光学系统热分析的全流程,以双胶合透镜为例,重点阐述了如何通过多重结构编辑器模拟温度变化,并利用关键操作数优化系统以抵抗温度漂移。文章提供了从基础设置到高级优化的实战技巧,帮助工程师快速掌握无热化设计方法,确保系统在宽温范围内保持稳定成像性能。 阅读详情

传送门:点击打开链接


题意:一个N*N的网格,从左下角走到右上角需要的最短步数。要求不能经过# 而且路径不能经过一个三角形的内部,可以沿边走。


分析:计算几何题里不算难题,但若没想到坑点就一直卡题了。

我采用的判断线段相交方法是规范相交,判断点是否在线段上包括了点在线段端点的情况

假设当前路径是线段L,三角形为ABC

先预处理,若格子在三角形内部,设置为#

case1:L的一个端点在外,一个在内。只要枚举L跟三角形所有边是否规范相交即可。

case2:L的两个端点都在三角形的边上,判断L的中点是否在三角形内部即可

case3:最难想到吧。。一个端点在边上,另一个端点经过了三角形的一个顶点,而且L的中点在三角形外部。。

只要稍微缩短一下L的长度,也就是L的两个端点彼此靠拢很微小的距离,再判断两个端点是否在三角形内部。


还是刘汝佳蓝书的模板用的爽啊~~

AC代码:

#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

const double t = 1e-3;
const double eps = 1e-8;
int dcmp(double x){
    if (fabs(x)<eps) return 0;
    return x<0?-1:1;
}

struct Point{
   double x,y;
   Point(double x=0.0, double y=0.0) : x(x) , y(y) {}
   bool operator ==(const Point & rhs) const {
     return dcmp(x-rhs.x) == 0 && dcmp(y-rhs.y) == 0;
   }
};
Point A,B,C;
vector<Point>poly;

typedef Point Vector;
Vector operator +(Vector A, Vector B) {return Vector(A.x+B.x,A.y+B.y); }
Vector operator -(Vector A, Vector B) {return Vector(A.x-B.x,A.y-B.y); }
Vector operator *(Vector A, double p) {return Vector(A.x*p,A.y*p); }

double Dot(Vector A, Vector B) {return A.x*B.x+A.y*B.y; }
double Cross(Vector A, Vector B) {return A.x*B.y-A.y*B.x; }


bool isPointOnSegment(Point p, Point a1, Point a2) {
    if ( dcmp(Cross(a1-p,a2-p)) == 0 && dcmp(Dot(a1-p,a2-p))<0 ) return 1;
    return a1 == p || a2 == p;
}

struct Line{
    Point p1,p2;
    Line() {}
    Line(Point p1, Point p2) : p1(p1),p2(p2) {}
    void change(double t) {
       Vector v = p2-p1;
       p1 = p1 + v*t;
       v = v*(-1.0);
       p2 = p2 + v*t;
    }
};
Line AB,AC,BC;

bool LineIntersection(Line a, Line b) {
   double c1 = Cross(a.p2-a.p1,b.p1-a.p1), c2 = Cross(a.p2-a.p1,b.p2-a.p1);
   double c3 = Cross(b.p2-b.p1,a.p1-b.p1), c4 = Cross(b.p2-b.p1,a.p2-b.p1);
   return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0;
}

const int maxn = 25;
char s[maxn][maxn];
int n;

int isPointInPolygon(Point p) {
   int wn = 0 ,n = poly.size();
   for (int i=0; i<n; i++) {
      if (isPointOnSegment(p,poly[i],poly[(i+1)%n])) return -1;
      int k = dcmp(Cross(poly[(i+1)%n]-poly[i],p-poly[i]));
      int d1 = dcmp(poly[i].y-p.y);
      int d2 = dcmp(poly[(i+1)%n].y-p.y);
      if (k>0 && d1<=0 && d2>0) wn++;
      if (k<0 && d2<=0 && d1>0) wn--;
   }
   if (wn!=0) return 1;
   return 0;
}

void init(){
    double x,y;
    scanf("%lf%lf",&x,&y); A = Point(x,y);
    scanf("%lf%lf",&x,&y); B = Point(x,y);
    scanf("%lf%lf",&x,&y); C = Point(x,y);
    poly.clear();
    AB = Line(A,B); poly.push_back(A);
    BC = Line(B,C); poly.push_back(B);
    AC = Line(A,C); poly.push_back(C);

    char tmp[maxn][maxn];
    for (int i=0; i<n; i++) scanf("%s",tmp[i]);
    for (int i=0; i<n; i++)
       for (int j=0; j<n; j++) s[i][j] = tmp[n-1-j][i];

    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) if (s[i][j] == '.') {
             if (isPointInPolygon(Point(i,j)) == 1) s[i][j] = '#';
        }
    }

}

queue<Point>que;
int step[maxn][maxn];
int dx[] = {-1,1,0,0 , -1,-1,1,1};
int dy[] = {0,0,1,-1 , -1,1,-1,1};

int BFS(){
   while (!que.empty()) que.pop();
   memset(step,-1,sizeof(step));
   step[0][0] = 0;

   int x,y;
   int tx,ty;
   Point p,q;
   Point mid,tpoint;
   Vector v;

   p = Point(0.0,0.0); que.push(p);
   while (!que.empty()) {
        p = que.front(); que.pop();
        x = (int)p.x; y = (int)p.y;
        s[x][y] = '#';

        for (int i=0; i<8; i++) {
           tx = x + dx[i];
           ty = y + dy[i];
           if (tx<0 || ty<0 || tx>=n || ty>=n) continue;
           if (s[tx][ty] == '#') continue;
           if (step[tx][ty]!=-1) continue;

           q = Point(1.0*tx,1.0*ty);
           Line L = Line(p,q);
           // case1
           if (LineIntersection(L,AB) || LineIntersection(L,AC) || LineIntersection(L,BC)) continue;

           //casee2
           mid = Point((x+tx)*0.5,(y+ty)*0.5);
           if ( isPointInPolygon(mid) == 1 ) continue;

           // case3
           L.change(t);
           if (isPointInPolygon(L.p1) == 1 || isPointInPolygon(L.p2) == 1) continue;

           step[tx][ty] = step[x][y]+1;
           que.push(q);
        }
   }

   return step[n-1][n-1];
}

int main(){
    while (scanf("%d",&n)==1) {
        init();
        printf("%d\n",BFS());
    }
    return 0;
}

【C语言趣味教程】(0) 专栏介绍 这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过 阅读详情

相关推荐

C语言 在合并编译 ( 多.c文件 ) 情况下 实现 linked list ( 链表 ) 教程 . 更新ing

写在前面  依旧是参考借鉴了 浙江大学 温老师 的视频教程,很不错,在中国大学MOOC上,强力推荐!  虽说有借鉴,但是能保证的是每一行代码都是我自己经过理解后手敲出来的,所以才来做了这部分的教程。  最后,带 * 字符是我个人觉得可以添加的功能,按理来讲是可以不看的,而且大概率是可以有更好的改进的。  PS: 文章还在更新,如果文字蓝了(有超链接),说明写完了,如果没蓝,说明我在开军舰.jpg 源代码:  这里→源代码. 第一步:前置工作  先说一下每一篇都会出现 main 函数的,stage1 只是给没

weixin_47287635的博客 525

2017ACM-ICPC北京区域赛 E - Cats and Fish

传送门 题意: 开局三个数,m条鱼,n个猫,x时间,接下来一行是每只猫吃掉一条鱼分别花费的时间。如果有多只猫可以吃鱼先把鱼分给吃的快的猫。问在x分钟后这m条鱼还剩下多少完整的,剩下多少不完整的(猫还没吃完) 思路: 直接模拟。对每只猫吃鱼时间排序。num表示已吃完的鱼数,ans为正在吃的鱼数,设一个标记数组标记每只猫是不是正在吃鱼,它没有吃鱼才能给它分配新的鱼。对于每一分钟循环每一只猫的吃...

LATTE 601

LWIP协议栈在STM32H7上的内存优化实战:如何用32KB RAM实现稳定千兆以太网通信

本文深入探讨了在STM32H7微控制器上,如何通过内存优化策略,在仅32KB的D2 SRAM中稳定运行LWIP协议栈以实现千兆以太网通信。文章详细分析了STM32H7的内存架构、LWIP的内存消耗瓶颈,并提供了从描述符表与PBUF池精确分配、链接脚本修改到MPU区域划分的一整套实战优化方案,旨在解决大数据量传输卡死等常见配置问题。

gg901的博客 603

hihoCoder - 1633(2017北京icpc现场赛-G题)

题意:给你一个三角形的三个坐标,还有一张图,让你从图中的左下角走到右上角,左下角坐标是(0,0),每两点之间的长度是1,'.'代表能走,'#'代表不能走,并且每条路径不能碰到三角形内部,让你求最短路径长度。 北京错失铜牌,打铁而归,总是感觉很遗憾,也有点难受,这个题当时场上差一丢丢能出的,后来时

xqacmer 1347

OpenClaw与Ollama本地AI部署指南

AI模型本地化部署是当前企业数字化转型的关键技术,通过开源框架Ollama可以在消费级硬件上运行大语言模型。本文以OpenClaw多智能体系统为例,详解从环境配置到模型优化的全流程实践,特别针对国内开发者遇到的网络问题提供了镜像加速等解决方案。这种私有化部署方案尤其适合金融数据分析、企业知识管理等对数据安全要求高的场景,通过模块化设计实现多智能体协作,同时保持对NVIDIA显卡和普通CPU的兼容性。

weixin_34302561的博客 396

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2110

2017北京ICPC -G - Liaoning Ship’s Voyage (HihoCoder - 1633)几何

题目网址https://cn.vjudge.net/problem/HihoCoder-1633 比赛的时候只是想到了,将三角形内部的点换成#,然后与三角形严格相交的走法的线段不可行,但是端点相交是可行的。   但是我们忽略了一种情况,就是端点与三角型相交,但是两个端点交于三角形的不同边,这种是错误的,后来我改了之后还想到了一种情况会wa,后来枚举情况,把我hy给搞懵了   看了看人...

DS00HY的小博客 709

大数据领域数据建模的多源数据融合技术

在大数据时代,数据来源呈现出多样化的特点,包括企业内部的不同业务系统数据、外部的社交媒体数据、传感器数据等。这些多源数据蕴含着丰富的信息,但由于数据格式、语义、质量等方面的差异,难以直接进行分析和利用。多源数据融合技术的目的就是将这些来自不同数据源的数据进行整合、清洗、关联和统一,构建一个具有一致性和完整性的数据模型,以便更好地挖掘数据背后的价值,为企业决策、科学研究等提供有力支持。

Java大师兄的博客 1305

ICPC 2017 北京 Liaoning Ship’s Voyage

题目地址:http://hihocoder.com/problemset/problem/1633?sid=1234017   题目大意:在二维平面内,船从(0,0)出发到(n-1,n-1)结束,求最短路,要求:一个点可以向周围8个方向走,距离都为1,并告诉哪些点不可以走,同时要求路线不可以穿过一个三角形。       题解:对每个点标号,建图,最后SPFA搞一下。连边时要判断路线是否...

Spy97的博客 783

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6983

瑞萨单片机-硬件I2C从设备

瑞萨单片机上实现I2C从机,根据主机发来的数据,从机返回或者保存数据2、R5F1115AxFL最多支持3个从设备地址(即可以作为三个从设备)3、从接收模式:直接将数据保存到RAM中,接收完再处理4、从发送模式:按照I2C读取传感器数据经验,主机读取从设备时,从设备需要立刻返回数据的,但是程序要如何实现一收到指令就返回特定的数据?(时钟拉伸)这里先跳过,我们先实现返回固定的数据。

qq_27893147的博客 3220

ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I.Minimum(线段树区间极值+分类讨论)

You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. Output Minx,y∈[l,r] {ax∙ay}. 2. Let ax=y.

HJY 583

详细了解sklearn中的CountVectorizer

CountVectorizer 是 scikit-learn(一个流行的 Python 机器学习库)中的一个文本特征提取类,其核心功能是将一系列原始文本(如句子、文档)转换为基于词频(word count)的数值矩阵。它基于词袋模型(Bag of Words, BoW)思想,忽略文本的语法结构和词序,仅关注词汇在文本中出现的频率,从而将文本转化为机器可理解的数字形式。文本 1:"I love machine learning"

2302_76568160的博客 1118

北京赛区(2017)网络赛 之 Visiting Peking University

题目1 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for n days and the date of these days can be represented by n integers: 0, 1, 2,

ESESZB的博客 955

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2017icpc-beijing-j(pangu and stone)

同学去的比赛,j题是个dp就补了一下 原题:点击打开链接 #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the first living being and the creator of th

Yorozuya 607

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

2017ICPC北京 J:Pangu and Stones(区间DP)

#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the first living being and the creator of the sky and the earth. He woke up from

加载中... 3587

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【集训】2017icpc北京

E Cats and Fish m(5000)条鱼拿去喂n(100)只猫,给出每只猫吃一条鱼的时间(2000),当吃完一条后立即喂下一条,鱼不够时优先给吃速快的猫喂,问第x(1000)时刻后还剩下几条完整的鱼,几条不完整的鱼。 使用不易错的方法去写题 签到题,但是我浪费了很多时间。 这道题只有1000个时刻,每个时刻最多有100个事件发生,可以直接模拟时间推移。注意把每个时刻分为左时刻和右时刻...

秋叶红于二月花 540

ACM-ICPC 2017 北京赛区现场赛 E,F,J

链接:HihoCoder 1631E /* hihocoder 1631 : Cats and Fish * [题意]:给出n条鱼,m值猫,给出每个猫吃鱼的速度a[i]给出(吃的快的优先吃)。 * 问x分钟后所剩的完整的鱼的数量,和不完整的鱼的数量。 * * [分析]:由于吃鱼的速度不一样,将速度排序后,枚举1->x每个时间点, * 确认在当前状态下,每条鱼是否能够完整的吃完一条鱼和...

布呗之路 315

2017 ICPC 北京

E. 0:19:15 solved by hl 按照题意模拟即可 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdio> #include <queue> #...

weixin_30486037的博客 168

ICPC2017北京现场赛H Puzzle Game

题目链接:http://hihocoder.com/problemset/problem/1634 Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description Once upon a time, there was a little dog YK. One day, he

qq_36876305的博客 874

hihoCoder挑战赛31 题解

题目1 : Numbers时间限制:8000ms 单点时限:1000ms 内存限制:256MB 描述 给定n个整数常数c[1], c[2], …, c[n]和一个整数k。现在需要给2k个整数变量x[1], x[2], …, x[k], y[1], y[2], …, y[k]赋值,满足(1)对于所有1 ≤ i ≤ k,都有x[i] ≤ y[i]。(2)对于所有1 ≤ i ≤ n,都存在至少一个

nike0good |Oier&ACMer | 熟能生巧 925

HihoCoder 1317 题解

略略略

Bule-Zst的博客 616

2017 ICPC 北京站 E F J G H

Cats and Fish 题意: n只猫,m条鱼,第i只猫吃一只鱼需要\(C_i\),每只猫吃完当前这条鱼立即去吃下一条,问\(T\)时刻还剩多少条鱼,有多少条鱼正在被吃 思路: 以为是贪心,但是wa了(不懂),要模拟,具体看注释吧 const int N = 2*1e5+10; int n,m,k; int a[N]; int v[N]; int main(){ wh...

weixin_30278237的博客 163

2017icpc北京赛区网络赛E题(计算几何)

时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In 2333, the C++ Empire and the Java Republic become the most powerful country in the world. They compete with each other in the colonizing the Ma

creatorx的博客 1509

第一次参加ACM比赛 2017ICPC北京赛区

菜的不行。 封榜前184名 终榜 175 菜的不行。 F题水题,队友俩小时敲完,但是,一直WA,最后一小时把输入改成每次读一行,过了。、 E题水题,我他妈花了2个多小时想清楚,虽然我第三个小时开始敲,这不怪队友,怪我想的太慢,我要是早早想清楚了,我肯定就上去敲了。很水的一道题目,第一遍写的时候,有个标记忘记敲了,然后我下来想了20分钟,上去改掉,才过的。水题切太慢,这题怪我。 J题,区间

xyry 666

hihoCoder - 1878 Palindromes (找规律)(2018ICPC北京I)

时间限制:1000ms 单点时限:1000ms 内存限制:512MB 描述 Recently, Nvoenewr learnt palindromes in his class. A palindrome is a nonnegative integer that is the same when read from left to right and when read from ri...

LP_Cong 1044
上一篇: 第13届 广工校赛 题解汇总
下一篇: 2-SAT专题练习 (题解+AC代码)
罗侯
博客等级 码龄10年 135粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值