题解|2023暑期杭电多校05

news2024/11/15 13:44:18

【原文链接】
(补发)题解|2023暑期杭电多校05

1001.Typhoon

计算几何

题目大意

依次给定 n n n 个坐标 P P P ,预测的台风路线为按顺序两两连接给定坐标所得的折线
现在有 m m m 个庇护所的坐标 S S S ,求每个庇护所到台风路线的最短距离
请添加图片描述

解题思路

对于每个庇护所坐标,求它到每个路线线段的距离,再取最短即可
常见的错误为计算了点到线段所在直线的距离,而非到线段的距离(别问我怎么知道的

问题转移到如何计算点到线段的距离
可以考虑将线段表示为向量,记为 v e c vec vec ;点到线段两端的向量记为 v e c 1 , v e c 2 vec1,vec2 vec1,vec2
如果 v e c 1 , v e c 2 vec1,vec2 vec1,vec2 v e c vec vec 的点积同时大于 0 0 0 或同时小于 0 0 0 ,则距离在端点取到,否则距离为点到直线的距离//
具体说明可以参考代码注释

时间复杂度

O ( n m ) O(nm) O(nm)

参考代码

vector<pll> typh,shel;
vector<double> frac,dist;
double cal_dist(pll s,pll t1,pll t2){//
    ll x,y,x1,y1,x2,y2,p1,p2;
    pll vec,vec1,vec2;double re;
    x=s.first;y=s.second;//庇护所坐标
    x1=t1.first;y1=t1.second;//端点1
    x2=t2.first;y2=t2.second;//端点2
    vec={x2-x1,y2-y1};vec1={x-x1,y-y1};vec2={x-x2,y-y2};
    //线段向量、点到两个端点的向量
    p1=vec.first*vec1.first+vec.second*vec1.second;//点积1
    p2=vec.first*vec2.first+vec.second*vec2.second;//点积2
    if(p1<=0&&p2>0||p1>0&&p2<=0){//点到直线距离
        double frac=(double)sqrt((y2-y1)*(y2-y1)+(x1-x2)*(x1-x2));
        re=(double)fabs((y2-y1)*x+(x1-x2)*y-y2*x1+x2*y1)/frac;
    }else{//点到端点距离
        double dist1=(double)sqrt(vec1.first*vec1.first+vec1.second*vec1.second);
        double dist2=(double)sqrt(vec2.first*vec2.first+vec2.second*vec2.second);
        re=min(dist1,dist2);
    }
    return re;
}
void solve()
{
    ll n,m;
    cin >> n >> m;
    typh.resize(n);shel.resize(m);dist.resize(m);
    for(auto &[x,y]:typh) cin >> x >> y;
    for(auto &[x,y]:shel) cin >> x >> y;
    FORLL(i,0,m-1){dist[i]=INF;
        FORLL(j,0,n-2)
            dist[i]=min(dist[i],cal_dist(shel[i],typh[j],typh[j+1]));}
    for(double i:dist) {print_float(i,4);cout << endl;}
}

1006.Touhou Red Red Blue

贪心/DP

题目大意

你将依次收到 n n n 个物品,他们具有颜色红、绿或蓝,记为 R , G , B R,G,B R,G,B

你有一个大小为 2 2 2 的物品栏。每当你收到一个物品,你可以考虑将其放入物品栏或直接丢弃
物品栏是一个栈,这意味着如果你决定放入物品但物品栏是满的,你将丢弃更早放入的那个物品,并将手上的物品放入

下面是物品的得分和消除规则:

  1. 如果手上和物品栏中共 3 3 3 个物品颜色相同,则消除这 3 3 3 个物品,得到 1 1 1 分(这是唯一的得分方式),并在物品栏得到 1 1 1 个颜色由你决定的新物品
  2. 如果手上和物品栏中共 3 3 3 个物品颜色各不相同,则消除这 3 3 3 个物品,并在物品栏得到 2 2 2 个颜色由你决定的新物品

求对于给定的物品序列,可以得到的最高分是多少

解题思路

官方给出的做法是DP,但是考虑所有的状态转移略显繁琐,难以不重复、不遗漏
相比起来我还是更喜欢直接贪心的方法//

决定一种游戏策略前,先掌握游戏核心机制
首先,在贪心的思想下,物品栏的栈特性可以不考虑//因为如果需要被迫丢弃物品,大可以在拿到这个物品时就直接丢弃//
其次,注意到颜色任选的物品可以不立刻考虑,作为任意物品即可
考虑消除过程中的特点:

  1. 规则 2 2 2 消除后得到 2 2 2任意物品,可以配合规则 1 1 1 ,直接和下一个物品(若有)合成得分
  2. 规则 1 1 1 消除后留下 1 1 1任意物品。这意味着如果有得分,最后一定会留下 1 1 1任意物品

借助上面两个特点,单独考虑第一次消除,后续消除借助前面得到的任意物品,具体可以参考代码注释
计数直到满足条件消除,即视为取需要的物品,并直接丢弃无帮助的物品,重新计数即可

时间复杂度

O ( n ) O(n) O(n)

参考代码

int RGB(char c){
    switch (c)
    {
        case 'R':return 1;
        case 'G':return 2;
        default:return 3;
    }return 0;
}
void solve()
{
    string s;cin >> s;
    ll n=s.length(),res=0;
    int cur=0,cnt[4]={0};
    FORLL(i,0,n-1){
        cur=RGB(s[i]);cnt[cur]++;
        if(res){//消除过,前面必定有一个自选
            if(cnt[1]&&cnt[2]||cnt[1]&&cnt[3]||cnt[2]&&cnt[3]){
                //已有两种不同颜色+自选:选不同颜色,消3得2
                if(i+1==n) break;//没有下一个就结束
                i++;res++;//再用2个自选和下一个出现的颜色消除
                cnt[1]=cnt[2]=cnt[3]=0;
            }else if(cnt[1]==2||cnt[2]==2||cnt[3]==2){
                //已有两个相同颜色+自选:选相同颜色,消3得1
                res++;cnt[1]=cnt[2]=cnt[3]=0;
            }
        }else{//还没有消除过
            if(cnt[1]&&cnt[2]&&cnt[3]){//兼有三色:消3得2
                if(i+1==n) break;
                i++;res++;//再用2个自选和下一个出现的颜色消除
                cnt[1]=cnt[2]=cnt[3]=0;
            }else if(cnt[1]==3||cnt[2]==3||cnt[3]==3){//有三个同色:消3得1
                res++;cnt[1]=cnt[2]=cnt[3]=0;
            }
        }
    }cout << res << endl;
}

1007.Expectation (Easy Version)

数学期望

题目大意

n n n 次游戏,每次游戏胜利的概率为 a b \dfrac{a}{b} ba
对于给定的 m m m ,每次游戏胜利将获得 k m k^m km 分,其中 k k k 是当前总胜利局数,失败得 0 0 0
最终得分为 n n n 次游戏的得分之和,求最终得分的期望

解题思路

从全局角度考虑得分情况,游戏输赢概率满足二项分布,记获胜概率为 p = a b p=\dfrac{a}{b} p=ba
n n n 局游戏中赢 k k k 局的概率为: C n k ⋅ p k ( 1 − p ) n − k C_n^k\cdot p^k(1-p)^{n-k} Cnkpk(1p)nk
k k k 局游戏可以获得的最终得分记为 s c o r e ( k ) score(k) score(k) s c o r e ( k ) = ∑ i = 1 k i m score(k)=\sum\limits_{i=1}^k i^m score(k)=i=1kim
故最终得分期望为: E = ∑ i = 1 n C n k ⋅ p k ( 1 − p ) n − k ⋅ s c o r e ( k ) E=\sum\limits_{i=1}^n C_n^k\cdot p^k(1-p)^{n-k}\cdot score(k) E=i=1nCnkpk(1p)nkscore(k)

分别预处理阶乘、乘方、得分数组,求和取模即可

时间复杂度

乘方、阶乘、求和取模: O ( n ) O(n) O(n)
得分(快速幂+前缀和): O ( n log ⁡ m ) O(n\log m) O(nlogm)
总时间复杂度: O ( n log ⁡ m ) O(n\log m) O(nlogm)

参考代码

参考代码为已AC代码主干,其中功能请读者自行实现

vector<ll> powp,pownp,score;//p的n次、q的n次、赢n局的得分
void solve()
{
    ll n,m,a,b,re=0;
    cin >> n >> m >> a >> b;
    ll p=mul(a,inv(b));//获胜的概率
    ll np=Get_Mod(1-p);//失败的概率
    powp.clear();pownp.clear();score.clear();
    powp.resize(n+1);pownp.resize(n+1);score.resize(n+1);
    powp[0]=pownp[0]=1;score[0]=0;
    FORLL(i,1,n){
        powp[i]=mul(powp[i-1],p);
        pownp[i]=mul(pownp[i-1],np);
        score[i]=add(score[i-1],qcpow(i,m));}
    FORLL(i,1,n)
        re=add(re,mul(score[i],mul(Get_Combination(n,i),mul(powp[i],pownp[n-i]))));
        //Ex(i)=C(n,i)*p^i*(1-p)^(n-i)*score(i)
    cout << re << endl;
}

1012.Counting Stars

计数

题目大意

定义 k k k 星状图:一个 k + 1 k+1 k+1 个节点, k k k 条边的无向图,中心节点与其他 k k k 个节点之间各有一条边,其他节点之间没有边
给定一个无向图 G = ( V , E ) , ∣ V ∣ = n , ∣ E ∣ = m G=(V,E),|V|=n,|E|=m G=(V,E),V=n,E=m ,记其中不同的 k k k 星状图的数量为 c n t k cnt_k cntk
求对于 2 ≤ k ≤ n − 1 2\le k\le n-1 2kn1 ,所有 c n t k cnt_k cntk 的异或和: c n t 2 ⊕ c n t 3 ⊕ ⋯ ⊕ c n t n − 1 cnt_2\oplus cnt_3\oplus \cdots \oplus cnt_{n-1} cnt2cnt3cntn1

解题思路

对于某个节点 i i i ,记它的度为 d e g i deg_i degi ,考虑以它作为中心节点的情况
简单的组合问题,以 i i i 为中心节点的 k k k 星图数量即 C n k C_n^k Cnk
遍历 n n n 个节点,在每个节点处对 2 ≤ k ≤ d e g i 2\le k\le deg_i 2kdegi k k k 星图计数取模
最终把所有结果做异或和即可

时间复杂度

预处理阶乘(计算组合数): O ( n ) O(n) O(n)
遍历节点: O ( n + m ) O(n+m) O(n+m)
异或和: O ( n ) O(n) O(n)
总时间复杂度: O ( n + m ) O(n+m) O(n+m)

参考代码

vector<ll> deg,cnt;
void solve()
{
    ll n,m;
    cin >> n >> m;
    deg.clear();deg.resize(n+1);cnt.clear();cnt.resize(n+1);
    ll u,v;
    FORLL(i,1,m){
        cin >> u >> v;
        deg[u]++;deg[v]++;
    }
    FORLL(i,1,n)
        FORLL(j,2,deg[i])
            cnt[j]=Get_Mod(cnt[j]+Get_Combination(deg[i],j));
    ll re=0;
    FORLL(i,2,n-1) re^=cnt[i];
    cout << re << endl;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AT89C51单片机的多功能自行车测速计程器(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的多功能自行车测速计程器的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 选题背景 原理图 PCB图 仿真图 代码 系统论文 资源下载 选题背景 美丽的夜晚&…

c++树(一)定义,遍历

目录 树的定义 树的基本术语 树的初始起点&#xff1a;我们定义为根 树的层次&#xff1a; 树的定义&#xff1a; 树的性质 性质1&#xff1a; 性质2&#xff1a; 树形结构存储的两种思路 树的遍历模板 树上信息统计方式1-自顶向下统计 树上信息统计方式2-自底向上统…

【漏洞复现】泛微E-Cology WorkflowServiceXml SQL注入漏洞

0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台&#xff0c;支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 泛微OAE-Cology 接口/services/WorkflowServiceXml 存在SQL注入漏洞&#xff0c;可获取数据库权限&#xff0c;导致数据泄露…

Purple Pi OH在Android11下测试WiFi和LAN的TCP和UDP传输速率

本文适用于在Purple Pi OH在Andriod11下如何测试WiFi和LAN的TCP和UDP传输速率。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开发者的…

C语言 ——— 在控制台上打印动态变化的菱形

目录 代码要求 代码实现 代码要求 输入 整数line &#xff0c;菱形的上半部分的长度就为line&#xff08;动态变化的菱形&#xff09; 菱形由 "*" 号构成 代码实现 #include<stdio.h> int main() {// 上半长int line 0;scanf("%d", &line)…

mysql常用函数五大类

mysql常用函数 1. 第一类&#xff1a;数值函数1.1 圆周率pi的值1.2 求绝对值1.3 返回数字的符号1.4 开平方&#xff0c;根号1.5 求两个数的余数1.6 截取正数部分1.7 向上取整数1.8 向下取整数1.9 四舍五入函数1.10 随机数函数1.11 数值左边补位函数1.12 数值右边补位函数1.13 次…

【网络工具】Charles 介绍及环境配置

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/iAmAo &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会整理一些工作或学习中用到的工具介绍给大家~ &#x1f4d8;Charles 系列其它文章&#xff1a;【网络…

PySide在Qt Designer中使用QTableView 显示表格数据

在 PySide6 中&#xff0c;可以使用 Qt Model View 架构中的 QTableView 部件来显示和编辑表格数据。 1、创建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名为csvShow.ui。QMainWindow上有两个部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具将ui文件转换为…

路由上传一个ui_control参数(uint32类型)控制页面UI显隐

前言&#xff1a;传一个uint32类型的值&#xff0c;通过 按位或操作符&#xff08;|&#xff09;来设置ui_control的值&#xff0c;通过按位与操作符&#xff08;&&#xff09;来检测是否显示或隐藏 简单介绍一下两个概念&#xff1a; 按位与操作符和按位或操作符都是二进…

LeetCode-随机链表的复制

. - 力扣&#xff08;LeetCode&#xff09; 本题思路&#xff1a; 首先注意到随机链表含有random的指针&#xff0c;这个random指针指向是随机的&#xff1b;先一个一个节点的拷贝&#xff0c;并且把拷贝的节点放在拷贝对象的后面&#xff0c;再让拷贝节点的next指向原链表拷贝…

申贷时,被大数据风控拒贷有哪些原因呢?

很多人特别是从事过金融行业的人来说&#xff0c;大数据风控相信都不陌生&#xff0c;因为现在的银行和机构对申贷人的大数据信用看的越来越重要&#xff0c;已然成看贷前审查的重要依据&#xff0c;那申贷时&#xff0c;被大数据风控拒贷有哪些原因呢?本文就与大家一起探讨一…

codeforces 1862A

文章目录 1. 题目链接2. 题目代码正确代码 3. 题目总结学习 1. 题目链接 Gift Carpet 2. 题目代码 正确代码 #include<iostream> #include<vector> using namespace std; char letterTable[21][21]; int main(){int testCase;cin >> testCase;int row;int …

如何培养企业内部的大客户管理能力

去年年底&#xff0c;A公司的销管老王因身体抱恙休了长假&#xff0c;销售小张在接手老王负责的某集团型大客户时却犯了难&#xff1a;双方历史成交的记录详情无从查起&#xff1b;维护客情关系又不知道该去拜访谁、哪位领导关心哪些信息&#xff1b;甚至集团客户各公司的跟进节…

【Python进阶】正则表达式、pymysql模块

目录 一、正则表达式的概述 1、基本介绍 2、快速使用re模块 二、正则的常见规则 1、匹配单个字符 2、原始字符串 3、匹配多个字符 4、匹配开头和结尾 5、匹配分组 三、Python与MySQL交互 1、pymysql模块的安装 2、pymysql的操作步骤 3、connection对象 4、cursor…

MongoDB教程(九):java集成mongoDB

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、环境准…

【Agent】信息提取场景

文章目录 场景说明超参数调整top_ktop_ptemparetureresponse_format 提示词优化提取任务通用提示词模板防止badcase的提示词特殊符合划分待提取内容 提取的后处理评估提取性能Experiment1、通过符号学定位原文信息1.1 首位字符在原文中的index1.2 首尾N个字符&#xff0c;中间字…

【计算机毕设论文】基于SpringBoot薪资管理系统

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 一. 功能介绍 &#x1f50d; 员工信息管理 - 系统可以轻松添加、编辑或删除员工信息&#xff…

操作系统基础 (二)

目录 六. 运行机制两种指令两种CPU状态两种程序 七. 中断和异常中断的作用中断类型中断机制基本原理 八. 系统调用定义系统调用与库函数系统调用实现的功能系统调用过程 九. OS体系结构内核分层结构模块化外核 十. 系统引导相关的数据磁盘数据主存数据 系统引导过程总述 十一. …

域泛化(Domain Generalization)

仓库&#xff1a;https://github.com/jindongwang/transferlearning 综述&#xff1a;https://arxiv.org/pdf/2103.03097、https://arxiv.org/pdf/2103.02503 1.问题及解决方案 出发点&#xff1a;需要解决domain shift、out-of-distribution (OOD)问题 解决方案&#xff1a;绕…

常用优秀内网穿透工具(实测详细版)

文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…