Advent Of Code 2023 Day 24 Solution

news/2024/12/4 20:35:49/文章来源:https://www.cnblogs.com/ninler/p/18587092

\[\texttt{Description} \]

\(n\) 个雪球,每个雪球用 \(6\) 个整数 \(x_i,y_i,z_i,u_i,v_i,w_i\) 表述,代表雪球 \(i\)\(t\) 时刻的位置是 \((x_i+u_it,y_i+v_it,z_i+w_it)\)

\(\texttt{Part 1 : }\)在只考虑 \(xy\) 平面的情况下,有多少对雪球的轨迹会在某一个特定的方形区间内相交?

\(\texttt{Part 2 : }\)现在有一个魔法雪球,它在与每一个雪球在 整数时间刻 时相遇。问这个雪球的坐标之和是多少,保证只有唯一解。

\(\texttt{Constaints : }n\le 300\).


\[\texttt{Part 1} \]

直接枚举每一对雪球,通过代数计算交点判断即可。

import sys
import recr=lambda a1,b1,c1,d1,a2,b2,c2,d2: (d2*a2+c2*b1-c2*b2-d2*a1)/(d2*c1-c2*d1) if d2*c1-c2*d1!=0 else 1e18
val=lambda k1,b1,x: b1+k1*x
fit=lambda l,r,x: x>=l and x<=ra=open(0).readlines()
l,r=map(int,a[0].split(' '))
a=list(map(lambda it:re.findall("[0-9-]+",it),a[1:]))
a=list(map(lambda it:list(map(int,it)),a))tar=0for i in range(len(a)):for j in range(i+1,len(a)):s=cr(a[i][0],a[i][1],a[i][3],a[i][4],a[j][0],a[j][1],a[j][3],a[j][4])t=cr(a[j][0],a[j][1],a[j][3],a[j][4],a[i][0],a[i][1],a[i][3],a[i][4])if s<0 or t<0 : continueif fit(l,r,val(a[i][3],a[i][0],s)) and fit(l,r,val(a[i][4],a[i][1],s)):tar+=1
print(tar)

\[\texttt{Part 2} \]

我们发现坐标很难直接求出,所以我们考虑先求速度。

假设我们先求 \(u_0\)

我们发现,对于两个拥有相同 \(u_i\) 值的两个雪球,在以他们为参考系的情况下,只有魔法雪球会动。

设他们的 \(x\) 坐标为 \(x_i\),\(x_j\),那么由于魔法雪球与他们只在整数时间刻时相遇,所以相遇的时间差也是整数。

\(\Large\frac{x_i-x_0}{u_i-u_0}-\frac{x_j-x_0}{u_i-u_0}=\frac{x_i-x_j}{u_i-u_0}\) 是整数。

即:

\[x_i-x_j\equiv 0\pmod{u_i-u_0} \]

那么我们就拥有了一堆同余的方程需要满足。

大胆假设速度必然不会很大,所以在 \([-5000,5000]\) 中暴力试数即可。

同理,\(v_0\)\(w_0\) 也可以求出。

现在,我们求出速度以后,以魔法雪球为参考系。由于所有雪球都与它相遇,所以此时 所有雪球的轨迹相交于一点

判断所有雪球的轨迹是否相交于一点后焦点就是答案。

import sys
import redef equ(x,y):return x==y or x==-1e18 or y==-1e18def calc(x):tx=[]for it in range(-5000,5000):flag=Truefor (l,vx) in x:if it==vx or l%(it-vx):flag=Falseif flag: tx.append(it)return txa=list(map(lambda it:re.findall(r"[\d-]+",it),open(0).readlines()))
a=list(map(lambda it:list(map(int,it)),a))x,y,z,tar=[],[],[],[]for i in range(len(a)):for j in range(i+1,len(a)):if a[i][3]==a[j][3]:x.append((abs(a[i][0]-a[j][0]),a[i][3]))if a[i][4]==a[j][4]:y.append((abs(a[i][1]-a[j][1]),a[i][4]))if a[i][5]==a[j][5]:z.append((abs(a[i][2]-a[j][2]),a[i][5]))
tx,ty,tz=calc(x),calc(y),calc(z)for vx in tx:for vy in ty:for vz in tz:la,lb=a[0],a[1]x0,y0,z0,u0,v0,w0=la[0],la[1],la[2],la[3]-vx,la[4]-vy,la[5]-vzx1,y1,z1,u1,v1,w1=lb[0],lb[1],lb[2],lb[3]-vx,lb[4]-vy,lb[5]-vzt1=(u1*y0-u1*y1-v1*x0+v1*x1)/(v1*u0-v0*u1)t2=(x0-x1+u0*t1)/u1if t1<0 or t2<0: continueres=(x0+u0*t1,y0+v0*t1,z0+w0*t1)if int(res[0])!=res[0] or int(res[1])!=res[1] or int(res[2])!=res[2]:continueflag=Truefor (x2,y2,z2,u2,v2,w2) in a:tt1=(res[0]-x2)/(u2-vx) if u2!=vx else (-1e18 if res[0]==x2 else 1e18+vx)tt2=(res[1]-y2)/(v2-vy) if v2!=vy else (-1e18 if res[1]==y2 else 1e18+vy)tt3=(res[2]-z2)/(w2-vz) if w2!=vz else (-1e18 if res[2]==z2 else 1e18+vz)flag&=(equ(tt1,tt2) and equ(tt2,tt3) and equ(tt1,tt3))if not flag: continuetar.append(((int(res[0]),int(res[1]),int(res[2])),(vx,vy,vz),int(sum(res))))
print('\n'.join(map(lambda it:str(it)[1:-1],tar)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846831.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心策略(未完结)

每次都试图解决问题的尽量大的一部分 如兑换硬币,先以最多数量的最大面值来迅速减少找零面值首先确定基本结束条件(最直接的情况——其面值正好等于某种硬币) 减小问题的规模 递归算法:#!/user/bin/env python3 # -*- coding: utf-8 -*- def recMC(coinValueList, change):…

电感的通低频阻高频特性的测试

用手持电桥测出电感的实际值,以保证在这个频率附近电感数值不会有太大变化 10k档     40k档   100k档 9.96mH    9.77mH   17.25mH 用示波器的信号发生器产生一个200k的信号,串接以上电感,查看输出波形当信号为200k时输出波形的峰峰值为1.55V(不接电感时为2.44…

whk1

选 \(B\)。

web19([GYCTF2020]Blacklist):

1.输入1回显出语法错误(找到注入点,是字符型) error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 1 at line 12.依次输入1 order by 3#、1 order by 1#、1 order by 2#…

linux,ssh连接

Linux,ssh远程连接 一、 linux端配置 1、安装ssh服务 sudo apt-get updatesudo apt-get install openssh-clientsudo apt-get install openssh-server2、启动ssh service ssh start3、检查是否成功启动ssh ps -e | grep ssh确保出现ssh-agent ,若无ssh-agent,执行下列代码 e…

【攻防技术系列】Rce漏洞数据不回显解决策略

一、数据带外1.1 DNSlog1.2 TCP-Portlog1.3 ICMP-Sizelog二、延迟判断三、写文件四、反弹权限4.1 反向连接4.2 正向连接免责声明 请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自行承担,所产生的一切不良后果与文章…

Quantization

目录引线性量化 (Linear Quantization)对称量化非对称量化非线性量化Power-of-XRoundingDeterministic roundingStochastic rounding[1] 进击的程序猿-模型压缩-神经网络量化基础.[2] Przewlocka-Rus D., Sarwar S. S., Sumbul H. E., Li Y. and De Salvo B. Power-of-two quan…

H5-28 清除浮动

浮动元素会造成父元素高度塌陷后续元素也会受到影响 1、浮动的作用当元素设置fliat浮动后,该元素就会脱离文档流并向左/向右浮动①浮动元素会造成父元素高度塌陷②后续元素会受到影响 <div class="box"><div class="a"></div><div…

第58篇 Redis常用命令

1.基本操作2.字符串(Strings)3.列表()4.哈希(Hashes)5.位图(Bitmaps)6.位域(Bitfields)7.集合(Sets)8.有序集合(SortedSets)9.流(Streams)10。地理空间(Geospatial)11.HyperLogLog

位运算(未完成)

1、如果n & (n-1)=0,则n为2的幂 2、 题1:找出唯一成对的数 1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现? 性质:AA=0,B0=B …

seleniumwire获取请求头参数

selenium-wire扩展了 Selenium 的 Python 绑定,让您可以访问浏览器发出的底层请求。 您编写代码的方式与使用 Selenium 的方式相同,但您可以获得额外的 API 来检查请求和响应并动态更改它们 一:简介 selenium是爬虫常用的手段之一,由于是使用浏览器驱动模拟手动操作,所以只…

Confusion pg walkthrough Intermediate

namp ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.188.99 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-04 04:50 UTC Nmap scan report for 192.168.188.99 Host is up (0.072s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE…