2021辽宁省大学生程序设计竞赛(正式赛)

比赛经过:写了七八题,有一个topsort写错地方了,本场题目都较为简单考的知识都比较明显

补题:有些题目还得多思考其实也不难

目录

B.阿强的路

C.传染病统计

D.阿强与网格

E.生活大爆炸

F.Capslock

G.字节类型

H.制造游戏币

I.完美主义

L.神奇的回答

M.比赛!


B.阿强的路

floyd变式

考虑到数据范围图论知识可以联想到floyed,注意题目要的结果是两点之间路径中的最大点权*最大边权最小,我们对于路径a-b就是要找到用了哪些点,跑了哪些边,由于floyd的性质本质就是dp,在用前k个点的时候的最短路,我们不妨按照点权排序去跑第k层,对于当前层次如果边权比我的大,说明在之前有一个边权更小的同时点权最小的答案当前不需要更新答案,本题重复考察了floyd的性质理解

int w[M];
LL g[M][M],f[M][M]; // 两边之间的最短路的最大边权和 两点之间最短路的最大边权*最大点权
struct code{int w,id;bool operator<(const code&t)const{return w<t.w;}
}e[N];void solve(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>w[i];e[i]={w[i],i};}sort(e+1,e+1+n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j]=g[i][j]=2e18;while(m--){int a,b;LL c; cin>>a>>b>>c;g[a][b]=g[b][a]=min(g[a][b],c);f[a][b]=f[b][a]=min(f[a][b],g[a][b]*max(w[a],w[b]));}for(int k=1;k<=n;k++)// 按照点权来排序使用最大的边权for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(g[i][j]>max(g[i][e[k].id],g[e[k].id][j])){ // 当前的大于 [i,e[k].id] 和 [e[k].id,j]g[i][j] = max(g[i][e[k].id],g[e[k].id][j]);f[i][j] = min(f[i][j],g[i][j]*max({w[i],w[j],e[k].w}));}// 由于我们是按照点权去跑的k如果当前的百年大于i,j的话说明前面有更小的点和更小的边权for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) f[i][j]=0;if(f[i][j]>1e18) f[i][j]=-1;cout << f[i][j] << ' ';}cout << endl;}return ;
}

C.传染病统计

暴力

看起来我们需要思考一下性质考虑并查集啥的但是注意到数据范围,我们直接排序之后对于每一个数一直左右跑即可

int a[15];void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int smax = 0, smin = n;for(int i=1;i<=n;i++){int j= i+1;int cnt = 1;while(j<=n and a[j]-a[j-1]<=2){cnt++;j++;}j=i-1;while(j>=1 and a[j+1]-a[j]<=2){cnt++;j--;}smax=max(smax,cnt);smin=min(smin,cnt);}cout << smin << ' ' << smax << endl;return ;
}

D.阿强与网格

数学小推理

对于数据范围我们可以发现肯定是要推出一些小式子的在o(1)的时间复杂度解决这个问题

对于特例可以直接判断,重合的,只有一条线的,我们可以作图模拟一下,当我的点没有抵达n,m同行或者同列的时候从可以直接跳min(n,m)-1到同一层,接着发现如果(n+m)是偶数的话是可以直接跳过去的否则就是必须走一步,对于到了同一层之后我们发现后面的跳和走步数是一样的就是做差,最优解就是 1.一直走过去 2.一直跳过去 3.跳过去之后走

int t,n,m,x,y;void solve(){cin>>n>>m>>x>>y;if(n==1 and m==1){ // 重合的点直接输出答案cout << 0 << endl;return ;}LL res1 = (LL)(n-1+m-1)*x; // 直接一步一步if(n==1 or m==1){ // 无法跳跃cout << res1 << endl;return ;}int ok = (n+m)%2;if(m>n) swap(n,m);int X = 1 + m-1 ,Y = m;LL res2 = (LL)(m-1)*y;LL cnt = n - X; // 步数if(cnt==0){ // 直接跳到了cout << min(res1,res2) << endl;return ;}if(ok){// 奇数 需要走一步res2 += min((LL)(cnt-1)*y+x,(LL)cnt*x);cout << min(res1,res2) << endl;}else{res2 += min((LL)cnt*y,(LL)cnt*x);cout << min(res1,res2) << endl;}return ;
}

E.生活大爆炸

小组合数公式

直接使用小范围组合数公式暴力求解即可

LL C[M][M];void init(){for(int i=0;i<M;i++)for(int j=0;j<=i;j++)if(!j) C[i][j]=1;else C[i][j]=C[i-1][j]+C[i-1][j-1];
}
void solve(){cin>>n>>m>>t;LL ans = 0;for(int i=4;i<=n;i++)for(int j=1;j<=m;j++){if(i+j==t){ans += (LL)C[n][i]*C[m][j];}}cout << ans << endl;return ;
}

F.Capslock

简单小模拟

使用islower(),toupper(),tolower()函数

void solve(){string s; cin>>s;n = s.size(); s=' '+s;int ok1 = islower(s[1]),cnt = 0;for(int i=1;i<=n;i++){if(isupper(s[i])) cnt++;}if(cnt==n){for(int i=1;i<=n;i++) s[i]=tolower(s[i]);}else if(ok1 and cnt==n-1){s[1] = toupper(s[1]);for(int i=2;i<=n;i++) s[i] = tolower(s[i]);}for(int i=1;i<=n;i++) cout << s[i];cout << endl;return ;
}

G.字节类型

大数比较

比较两个大数,直接先数位后大小即可

string s[N]={"127","32767","2147483647","9223372036854775807"," "};
string ans[N]={"byte","short","int","long","BigInteger"};void solve(){auto check = [&](string&a,string&b){if(a.size()>b.size() or a==b) return true;if(a.size()<b.size()) return false;n = a.size();for(int i=0;i<n;i++){if(a[i]==b[i]) continue;return a[i]>b[i];}return true;};string a; cin>>a;for(int i=0;i<=4;i++){if(i==4 or check(s[i],a)){cout << ans[i] << endl;return ;}}return ;
}

H.制造游戏币

有限制性的背包

可以发现要求有a的数量一定是大于b,说明,在买a的时候一定是要买b的有一个绑定的性质

我们可以建图来确定绑定关系,明显的如果说有环的话一定是无解的,他那个是注意到对于这个绑定性质可以使用dfs去跑,变成选这个物品要有的真实连带花费

int dp[N],p[N];
LL w[N];
bool in[N];
vector<int> g[N];
int find(int x){if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
void dfs(int u){for(auto&v:g[u]){w[v] += w[u];dfs(v);}if(!g[u].empty()) T -= w[u];// 表示严格的大于关系
}
void solve(){cin>>n>>m>>T;for(int i=1;i<=n;i++) cin>>w[i],p[i]=i;bool ok = false;while(m--){int a,b; cin>>a>>b;in[b]=true;g[a].push_back(b);int fa = find(a), fb = find(b);if(fa==fb){ok = true;}else{p[fa]=fb;}}if(ok){// 表示矛盾了cout << 0 << endl;return ;}for(int i=1;i<=n;i++) if(!in[i]) dfs(i);dp[0] = 1;for(int i=1;i<=n;i++)for(int j=w[i];j<=T;j++){dp[j] += dp[j-w[i]];dp[j] %= mod;}cout << dp[T] << endl;return ;
}

I.完美主义

线段树

明显的直接使用线段树维护即可,bool表示当前区间是否可行,同时维护每个区间的左右端点数用于两个区间结合的时候的判断

int w[N];
struct code{int l,r;int lx,rx;bool ok;
}tr[4*N];void pushup(code&u,code&l,code&r){if(!l.ok or !r.ok) u.ok = false;else{if(l.rx<=r.lx){u.ok = true;}else{u.ok = false;}}u.lx = l.lx,u.rx = r.rx;
}void pushup(int u){pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}void build(int u,int l,int r){if(l==r){tr[u]={l,r,w[l],w[l],1};return ;}tr[u]={l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}void modify(int u,int v ,int x){if(tr[u].l== v && v==tr[u].r){tr[u].lx = x ;tr[u].rx = x;return ;}int mid=tr[u].l+tr[u].r>>1;if(v<=mid) modify(u<<1,v,x);if(v>mid) modify(u<<1|1,v,x);pushup(u);
}code query(int u,int l,int r){if(tr[u].l>=l && tr[u].r<=r){return tr[u];}int mid=tr[u].l+tr[u].r>>1;if(r<=mid) return query(u<<1,l,r);else if(l>mid) return query(u<<1|1,l,r);else{code res;code ll=query(u<<1,l,r);code rr=query(u<<1|1,l,r);pushup(res,ll,rr);return res;}
}
void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>w[i];build(1,1,n);while(m--){int op,l,r; cin>>op>>l>>r;if(op==1){modify(1,l,r);}else{code t = query(1,l,r);cout << (t.ok ? "Yes" : "No") << endl;}}return ;
}

L.神奇的回答

简单模拟

void solve(){int x; cin>>x;if(x<18) cout << x << endl;else cout << 18 << endl;return ;
}

M.比赛!

topsort

按照题目映射一下直接跑topsort即可

int idx;
vector<int> g[N];
int in[N];
int q[N];
bool use[M][M];
void solve(){cin>>n;while(n--){char a,op,b,c;cin>>a>>op>>b>>c;if(!mp.count(a)){mp[a]=++idx;G[idx]=a;}if(!mp.count(b)){mp[b]=++idx;G[idx]=b;}if(!mp.count(c)){mp[c]=++idx;G[idx]=c;}int A = mp[a], B = mp[b] , C = mp[c];in[A]++,in[C]++;g[B].push_back(A);g[A].push_back(C); }vector<int> ans;auto topsort = [&](){queue<int> q;for(int i=1;i<=idx;i++) if(!in[i]) q.push(i);while(!q.empty()){int u = q.front(); q.pop();ans.push_back(u);for(auto&v:g[u]){if(--in[v]==0) q.push(v);}}return (int)ans.size() == idx;};if(topsort()){for(auto&v:ans) cout << G[v];cout << endl;}else{cout << "No Answer" << endl;} return ;
}

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

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

相关文章

AI模型:开源VS闭源,谁主沉浮?

简介&#xff1a;评价一个AI模型“好不好”“有没有发展”&#xff0c;首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径&#xff0c;你更看好哪一种呢&#xff1f; 开源AI模型的优点。 开源AI模型的最大优势在于其开放性和可访问性。通过将AI模型的源代码公开&a…

java学习四

Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…

<工控><PLC>汇川Easy521系列PLC与汇川SV630N伺服进行EtherCat通讯的相关配置及指令编写

前言 本系列是关于PLC相关的博文&#xff0c;包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌&#xff0c;汇川、信捷等国内品牌。 除了PLC为主要内容外&#xff0c;PLC相关元器件如触摸屏…

父子级分类统计分类下数量sql

1 SELECTA.* FROM(SELECTA.project_id,COALESCE ( A.category_id, 0 ) category_id,( -- 其它没有查询的分类, 就会是null, 所以会归为其它CASEWHEN COALESCE ( A.category_name, 其他分类 ) 其他分类 THEN 其他 WHEN COALESCE ( A.category_name, 其他分类 ) 强电系统 THE…

【Unity3D美术】URP渲染管线学习01

扫盲简介 URP渲染管线是Unity3d提供的一种视觉效果更好的渲染模式&#xff0c;类似的还有Built RP&#xff08;默认最普通的渲染模式&#xff09;\ HDRP(超高清&#xff0c;对设备要求高)&#xff0c;视觉效果好&#xff0c;而且占用资源少&#xff01;成为主流渲染管线模式&a…

基于Docker部署GitLab环境搭建

文件在D:\E\学习文档子目录压缩\专项进阶&#xff0c;如ngnix,webservice,linux,redis等\docker 建议虚拟机内存2G以上 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 注意&#xff1a;一定要配置阿里云的加速镜像 创建GitLab 的配置 (etc) 、 日志 (log) 、数…

成功案例(IF=7.4)| 代谢组+16s联合分析助力房颤代谢重构的潜在机制研究

研究背景 心房颤动&#xff08;AF&#xff09;是临床上最常见的持续性心律失常&#xff0c;具有显著的发病率和死亡率。高龄是房颤发病率、患病率和进展最显著的危险因素。与年龄在50-59岁之间的参与者相比&#xff0c;80-89岁之间的参与者患房颤的风险增加了9.33倍。目前尚不…

nss刷题(3)

1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含&#xff0c;考虑php伪协议&#xff0c;构造payload&#xff1a; ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …

Css 提高 - 获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

cmake uninstall like

如果有install_manifest.txt cat install_manifest.txt | sudo xargs rm #cat install_manifest.txt | xargs ls建议make install之前查看有没有make uninstall目标

cocos 写 连连看 小游戏主要逻辑(Ts编写)算法总结

cocos官方文档&#xff1a;节点系统事件 | Cocos Creator 游戏界面展示 一、在cocos编译器随便画个页面 展示页面 二、连连看元素生成 2.1、准备单个方块元素&#xff0c;我这里就是直接使用一张图片&#xff0c;图片大小为100x100&#xff0c;锚点为&#xff08;0&#xff0…

ESP32基础应用之使用手机浏览器作为客户端与ESP32作为服务器进行通信

文章目录 1 准备2 移植2.1 softAP工程移植到simple工程中2.2 移植注意事项 3 验证4 添加HTML4.1 浏览器显示自己编译的html4.2 在使用html发数据给ESP324.3 HTML 内容4.4 更新 html_test.html 1 准备 参考工程 Espressif\frameworks\esp-idf-v5.2.1\examples\wifi\getting_sta…

PMapper:助你在AWS中实现IAM权限快速安全评估

关于PMapper PMapper是一款功能强大的脚本工具&#xff0c;该工具本质上是一个基于Python开发的脚本/代码库&#xff0c;可以帮助广大研究人员识别一个AWS账号或AWS组织中存在安全风险的IAM配置&#xff0c;并对IAM权限执行快速评估。 PMapper可以将目标AWS帐户中的不同IAM用户…

Hive环境搭建

1 安装Hive 下载文件 # wget -P /opt/ https://mirrors.huaweicloud.com/apache/hive/hive-2.3.8/apache-hive-2.3.8-bin.tar.gz 解压缩 # tar -zxvf /opt/apache-hive-2.3.8-bin.tar.gz -C /opt/ 修改hive文件夹名字 # mv /opt/apache-hive-2.3.8-bin /opt/hive 配置环境变量 …

torch Embedding 学习笔记

文本向量化&#xff08;Text Embedding&#xff09;&#xff1a;将文本数据&#xff08;词、句子、文档&#xff09;表示成向量的方法。 词向量化将词转为二进制或高维实数向量&#xff0c;句子和文档向量化则将句子或文档转为数值向量&#xff0c;通过平均、神经网络或主题模…

帧动画播放出现oom异常分析及解决

问题描述 需要播放序列帧&#xff0c;帧数特别多的时候会oom 问题分析 源代码每一帧都创建一次bitmap&#xff0c;极度消耗内存 bitmap.recycle并不会立刻回收内存&#xff0c;内存还是会很紧张 问题解决 利用inbitmap&#xff0c;每一帧复用同一片内存区域 //设置Bitmap…

【大模型部署】在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型

【大模型部署】在C# Winform中使用文心一言ERNIE-3.5 4K 聊天模型 前言 今天来写一个简单的ernie-c#的例子&#xff0c;主要参考了百度智能云的例子&#xff0c;然后自己改了改&#xff0c;学习了ERNIE模型的鉴权方式&#xff0c;数据流的格式和简单的数据解析&#xff0c;实…

软件安装:Linux安装Nginx

软件安装&#xff1a;Linux如何安装软件&#xff0c;程序。 源码安装 类似于.exe 源码包就是一堆源代码程序组成的。 linux tar.gz 这个就是源码包 源码包--------二进制包&#xff0c;源码包里面的代码经过编译之后形成的包。 优点&#xff1a;1、开源&#xff0c;可以二次…

面试八股之MySQL篇1——慢查询定位篇

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

JavaScript 数组方法总结

JavaScript 数组方法总结 创建数组访问和修改数组&#xff08;长度 &#xff06; 元素&#xff09;添加和删除元素数组遍历元素查找过滤和映射归并和缩减数组的连接数组的扁平化数组的排序数组的反转数组的复制数组的测试数组的填充 创建数组 Array.of(...elements): 创建一个…