【vjudge训练记录】大一寒假专项训练——枚举算法

news/2025/1/20 18:02:14/文章来源:https://www.cnblogs.com/longxingx/p/18681669

训练情况

A题

给定 \((x,y)\),倒着枚举地毯的范围是否覆盖 \((x,y)\),如果覆盖直接输出,如果全部枚举完都没有则输出 -1

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;int x[n+1],y[n+1],a[n+1],b[n+1];for(int i = 1;i<=n;i++){cin>>x[i]>>y[i]>>a[i]>>b[i];}int xx,yy; cin>>xx>>yy;for(int i = n;i;i--){if(xx >= x[i] && xx <= x[i]+a[i] && yy >= y[i] && yy <= y[i]+b[i]){cout<<i<<endl;return;}}cout<<-1<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

B题

求有多少对 \((P,Q)\) 使得 \(\gcd(P,Q)=x_0\)\(\operatorname{lcm}(P,Q)=y_0\)

另外有一个性质就是 \(\gcd(P,Q) \times \operatorname{lcm}(P,Q) = P \times Q\)

所以我们已知这三个条件,我们可以枚举 \(P\),然后判断是否存在一个 \(Q\) 满足上述三个条件,由于成对存在,所以我们枚举的上界只需要到 \(\sqrt{nm}\),然后 \((P,Q)\)\((Q,P)\) 视为两种不同的答案,最后对数需要乘二,注意一下 \(P = Q\) 的情况要减掉

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int m,n;cin>>m>>n;int ans = 0;n*=m;for(int i=1;i<=sqrt(n);i++){if(n%i==0&&__gcd(i,n/i)==m) ans++;}cout<<ans*2-(m==n/m)<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

C题

\(n\) 个数,要满足 \(\lvert a_i - a_{i-1} \rvert\) 覆盖 \([1,n)\) 的所有整数,所以我们直接枚举,两个元素差的绝对值如果超过上述范围则无法满足条件,反之则存在。这题有一个小性质,排不排序都不会影响最终差绝对值覆盖的区间。

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;int a[n+1];for(int i = 1;i<=n;i++) cin>>a[i];for(int i = 2;i<=n;i++){int x = abs(a[i] - a[i-1]);if(x > n-1 || x < 1){cout<<"Not jolly"<<endl;return;}}cout<<"Jolly"<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

D题

找数列中有多少对 \((i,j,k)\) 使得 \(a_i + a_j = a_k\)\(i,j,k\) 互不相同),所以我们可以开一个数组表示某个数字是否出现过,然后枚举两个数 \(i,j\),判断是否存在 \(a_k = a_i + a_j\) 中的 \(a_k\) 是否存在,题目所述 其中有多少个数,恰好等于集合中另外两个(不同的)数之和? \(a_k\) 对答案的贡献最多为 \(1\),所以答案自增后 \(a_k\) 需要标记成没出现过

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;int a[n + 1];map<int,bool> vis;for(int i = 1;i<=n;i++) cin>>a[i],vis[a[i]]=1;int ans = 0;for(int i = 1;i<=n;i++){for(int j = i+1;j<=n;j++){if(vis[a[i] + a[j]]) ans++,vis[a[i]+a[j]]=0;}}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

E题

直接枚举区间 \([l,r]\) 的时间复杂度为 \(O(n^2)\) 会超时,对于区间求和的问题我们容易想到前缀和,但是我们需要处理区间是 \(k\) 的倍数,我们考虑对前缀和对 \(k\) 取模(取余数),如果位置 \(l,r\) 的前缀和 \((p_l \mod k) = (p_r \mod k)\) 则说明区间 \([l,r]\) 的和一定是 \(k\) 的倍数,因为 \((x \mod b) = ((x + kb) \mod b)\),所以我们需要统计 \(p_i\) 余数的出现次数,遍历的时候查询当前位置余数在前面出现了几次,就是有几个区间,答案加上区间个数即可,注意一下初始条件,详情见代码

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,k; cin>>n>>k;int a[n+1],pre[n+1],cnt[n+1];pre[0] = 0;for(int i = 1;i<=n;i++) cin>>a[i],cnt[i] = 0;for(int i = 1;i<=n;i++) pre[i] = pre[i-1] + a[i];for(int i = 1;i<=n;i++) pre[i] %= k;cnt[0] = 1;int ans = 0;for(int i = 1;i<=n;i++){ans += cnt[pre[i]];cnt[pre[i]]++;}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

F题

求有多少对 \((i,j)\) 使得 \(a_i\)\(a_j\) 的倍数,我们先统计一个数 \(x\) 在数列中的出现次数,考虑枚举 \(a_i\) 的倍数,枚举的上界为 \(k \times a_i \le max(a_i)\),如果 \(k \times a_i\) 至少出现了一次,则必定存在 \((a_i,k \times ai)\) 这一对,答案为倍数的出现次数之和,即 \(\sum{v_{k a_i}}\)

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;const int N = 5e5 + 3;int n,a[N],v[N],ma;
int ans;void solve(){cin>>n;for(int i = 1;i<=n;i++) cin>>a[i],v[a[i]]++,ma=max(ma,a[i]);for(int i = 1;i<=n;i++){for(int j = 1;a[i]*j<=ma;j++){ans+= v[a[i]*j];}}cout<<ans-n<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

G题

羊和狼在相邻的两个动物相同和不同时的说法是相反的,我们容易发现,只要固定了前两个动物,共有四种情况 (狼,狼)、(狼,羊)、(羊,羊)、(羊,狼),后面的动物都可以根据题目所给的说法计算出来,由于这题是一个环,所以判断首尾动物的说法是否自相矛盾,即前两只动物的说法是否和最后两只动物的说法自相矛盾,如果四种情况都自相矛盾则说明无解,否则任意输出一种合法情况均正确

点击查看代码
#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 3;int n; char s[N];bool flag = false;
char ans[N];bool pd(){bool fflag = true;if(s[0] == 'o' && ans[0] == 'S'){if(ans[1] != ans[n-1]) fflag = false;}if(s[0] == 'x' && ans[0] == 'S'){if(ans[1] == ans[n-1]) fflag = false;}if(s[0] == 'o' && ans[0] == 'W'){if(ans[1] == ans[n-1]) fflag = false;}if(s[0] == 'x' && ans[0] == 'W'){if(ans[1] != ans[n-1]) fflag = false;}//if(s[n-1] == 'o' && ans[n-1] == 'S'){if(ans[0] != ans[n-2]) fflag = false;}if(s[n-1] == 'x' && ans[n-1] == 'S'){if(ans[0] == ans[n-2]) fflag = false;}if(s[n-1] == 'o' && ans[n-1] == 'W'){if(ans[0] == ans[n-2]) fflag = false;}if(s[n-1] == 'x' && ans[n-1] == 'W'){if(ans[0] != ans[n-2]) fflag = false;}return fflag;
}void mj(){for(int i = 1;i<n-1;i++){//for(int j = 0;j<n;j++) cout<<ans[j];if(ans[i] == 'S'){if(s[i] == 'o') ans[i+1] = ans[i-1];else {if(ans[i-1] == 'S') ans[i+1] = 'W';else ans[i+1] = 'S';}} else {if(s[i] == 'x') ans[i+1] = ans[i-1];else {if(ans[i-1] == 'S') ans[i+1] = 'W';else ans[i+1] = 'S';}}}
}void SS(){if(flag) return;ans[0] = 'S'; ans[1] = 'S';mj();if(pd()){flag = true;for(int i = 0;i<n;i++) cout<<ans[i];}
}void SW(){if(flag) return;ans[0] = 'S'; ans[1] = 'W';mj();if(pd()){flag = true;for(int i = 0;i<n;i++) cout<<ans[i];}
}void WS(){if(flag) return;ans[0] = 'W'; ans[1] = 'S';mj();if(pd()){flag = true;for(int i = 0;i<n;i++) cout<<ans[i];}
}void WW(){if(flag) return;ans[0] = 'W'; ans[1] = 'W';mj();if(pd()){flag = true;for(int i = 0;i<n;i++) cout<<ans[i];}
}int main(){cin>>n;cin>>s;SS();SW();WS();WW();if(!flag) cout<<-1<<endl;return 0;
}

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

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

相关文章

Khepri C2 framework beacons记录(之前的)

1、背景 在查看进程时发现可疑隐藏进程,名称为.test(.test.93627),隐藏文件,很可疑,于是查了下进程日志发现如下:/private/tmp/.test /private/var/db/oah/4b8f81eadefb42da07e9e88fa7905df57faec82d8621008e0ae4a04d81e2169f/bb9595accf35a51de80f42e656bdb2217238af58…

(重要***)查询自己需要的SQL语句

凡是指标相关的,先清空相关干扰条件,然后点击确认,比如加载性能里的列表页面,要查慢加载次数这个指标这个时候去这个数据库 写SQL语句select* fromquery_log ql whereql.user_name = sheng.yu-n@msxf.com order byexec_time desc limit 50然后找到自己对应操作的SQL 通过结…

最强截图录屏工具ShareX v17.0.0 中文绿色版

软件介绍 ShareX 是一款功能强大的屏幕截图和屏幕录制工具,可用于创建高质量的屏幕截图、动画 GIF 和屏幕录像,并提供多种上传选项,使用户能够轻松地将它们共享到互联网上。除此之外,它还支持多种自定义功能,例如图像编辑、颜色拾取、OCR 文字识别等。软件功能快速截图:简…

动态可视化:一步步拆解LSTM和GRU

转自:https://zhuanlan.zhihu.com/p/47907312 编者按:关于LSTM,之前我们已经出过不少文章,其中最经典的一篇是chrisolah的《一文详解LSTM网络》,文中使用的可视化图片被大量博文引用,现在已经随处可见。但正如短视频取代纯文字阅读是时代的趋势,在科普文章中,用可视化取…

【大屏可视化】系统(Vue3 + ECharts5)快速实现和应用 ️

🎶【大屏可视化】系统(Vue3 + ECharts5)🎶这八部~~按照,难易的顺序来进行绘制!!!💯横向柱形图竖向柱形图雷达图环形图关系图数据云图数据展示图地图可视化02:基于 vite 与 tailwindcss 创建大屏可视化项目 1,基于 vite 创建项目,使用: npm create vite@latest …

Markdown转Beamer进阶

接上一篇介绍的基本Markdown通过pandoc编译转为Beamer风格文档的文章,本文主要介绍一些Markdown转Beamer其中的进阶用法。如Mermaid流程图,和Algorithms算法伪代码的使用等。技术背景 在前面的一篇文章中,我们介绍过Markdown转Beamer的基本方法。通过这个方案,我们可以只写…

Markdown转Beamer坑点

接上一篇介绍的基本Markdown通过pandoc编译转为Beamer风格文档的文章,本文主要介绍一些Markdown转Beamer其中的进阶用法。如Mermaid流程图,和Algorithms算法伪代码的使用等。技术背景 在前面的一篇文章中,我们介绍过Markdown转Beamer的基本方法。通过这个方案,我们可以只写…

解决H7-TOOL脱机烧录Nordic的nRF5340系列的NET核,至此APP核和NET核均可以烧录(2025-01-15)

1、5340是双核的,一个APP核是128MHz,1MB Flash,还有一个网络的核是256KB Flash, 64MH,当前烧录APP核的Flash和NET核的Flash都已经没问题。 2、推荐使用扇区擦除,整片擦除不稳定,出问题后也容易芯片保护。NET核在线烧录(在线烧录是方便验证测试,上位机和下位机均无需联…

Keepalived ip漂移

当 Nginx 部署在多个服务器节点上,且希望在一个节点故障时,客户端流量自动切换到另一个节点时,需要使用 IP 漂移。 这里使用使用 Keepalived 实现 IP 漂移 一.安装配置 Keepalived安装 Keepalived 在所有运行 Nginx 的节点上安装 Keepalived:# 在 CentOS 上 sudo yum insta…

怎么添加财务部打印机

添加打印机输入以下地址输入用户名和密码验证 # administrator # 123456自动安装驱动,安装驱动完成即可

https证书管理系统-自动化部署

免费HTTPS证书(SSL证书)- 自动化部署 步骤1:复制生成的linux脚本命令步骤2:拷贝到部署站点的linux服务器上运行步骤三:刷新页面,即可看到此时的节点记录步骤四:点击“配置证书”,选择证书后自动部署步骤五:节点部署已完成,后续自动调度部署,无需干预

vmware vCenter证书故障处理

故障现象:重启vCenter后出现503错误:解决方法: 一、登陆ssh到vcenter,重新生成证书 先关掉HA,不然证书管理会报错。 做好vCenter快照 执行证书管理命令: /usr/lib/vmware-vmca/bin/certificate-manager按照提示输入:其中IP地址和域名必须输入自己集群的,域名…