集训5 20240209

news/2025/2/11 19:40:57/文章来源:https://www.cnblogs.com/dianman/p/18706723

集训5 20240209

牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

A:

题目大意:给出一个整数和一个操作符,生成两个能组成这个数的因子

#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;int main()
{long long x;char op;cin>>x>>op;if (op=='*'){cout<<x<<' '<<1<<endl;}if (op=='+'){cout<<x-1<<' '<<1<<endl;}if (op=='-'){cout<<x+1<<' '<<1<<endl;}return 0;
}

签到模拟

J:

题目大意:给出一个字符串,根据字符的不同计算总路程,不同字符表示对速度的不同操作

#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;int main()
{int n;cin>>n;long long ans=0,v=0;vector<char> op(n+5);for (int i=1;i<=n;i++) cin>>op[i];for (int i=1;i<=n;i++){if (op[i]=='0'){v+=10;ans+=v;}if (op[i]=='1'){if (v-5>=0){v-=5;ans+=v;}else{v=0;ans+=v;}}if (op[i]=='2'){if (v-10>0){v-=10;ans+=v;v+=10;}else{int t=v;v=0;ans+=v;v=t;}}}cout<<ans<<endl;return 0;
}

v记录当前的速度,ans 存答案,乱模拟就行

B:

题目大意:有 \(n\) 个元素,其中存在 \(k\) 个元素被标记,\(t\) 个以上没有被标记的连续元素为一组,排列被标记的数后求分组的最大数量

#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;long long n,t,k;bool judge(long long x){if (t*x+k<=n)return 1;elsereturn 0;
}void solve(void){cin>>n>>t>>k;long long lb=(t+1)*k;if (lb<=n){if (n-lb>=t)cout<<k+1<<endl;elsecout<<k<<endl;}else{long long l=-1,r=k+1;while (l+1!=r){long long mid=l+r>>1;if (judge(mid))l=mid;elser=mid;}cout<<l<<endl;}
}int main()
{int T;cin>>T;while(T--)solve();return 0;
}

原本想得太复杂了卡了 \(4\) 发,最终的代码虽然正确但是不够简单,用了二分来算

实际上仔细审视这个问题,将 \(k\) 个被标记的元素去除后我们还能用 \(n-k\) 个元素,那么这些元素可以分出 \(\lfloor\frac{n-k}{t}\rfloor\)

但是这 \(k\) 个被标记的元素最多能将这 \(n\) 个元素分为 \(k+1\)

所以只需要简单的判断最小值即可

void solve() {int n, t, k;cin >> n >> t >> k;cout << min(k+1,(n-k)/t)<<endl;
}

I:

题目大意:给出两个数 \(n,m\) 可以进行两种操作

  • \(n\) 乘以二
  • \(n\) 开方后向下取整

判断是否能通过以上两种操作使 \(n\) 变为 \(m\)

#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;void solve(void){int n,m;cin>>n>>m;if (n==0&&m!=0||m==0&&n!=0){cout<<"NO"<<endl;return;}cout<<"YES"<<endl;return;
}int main()
{int T;cin>>T;while (T--)solve();return 0;
}

猜的结论,当且仅当 \(n,m\) 中仅有一个为 \(0\) 时才不能转变,否则一定能组合出答案

证明如下:

存在一个数 \(x\)

\[y^{2^n}\le x\le (y+1)^{2^n} \]

取对数后,不等式转化为

\[2^n(\log_2(y+1)-\log_2{y})>1 \]

所以一定存在正整数 \(m\) 使得 \(x=2^m\)\(x\) 经过多次操作可以得到 \(y\)

C:

题目大意:

#include<bits/stdc++.h>
#define cintie ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;long long n,x,y;int main()
{cin>>n>>x>>y;string a,b,c;cin>>a>>b>>c;int cnt[4]={0};for (int i=0;i<n;i++){if (((a[i]-'0')^(b[i]-'0'))!=(c[i]-'0')){if (a[i]=='0'&&b[i]=='0') cnt[0]++;if (a[i]=='0'&&b[i]=='1') cnt[1]++;if (a[i]=='1'&&b[i]=='0') cnt[2]++;if (a[i]=='1'&&b[i]=='1') cnt[3]++;}}long long ans=1ll*x*(cnt[0]+cnt[1]+cnt[2]+cnt[3]);sort(cnt,cnt+4);if (cnt[3]>cnt[0]+cnt[1]+cnt[2]){ans=min(ans,(cnt[0]+cnt[1]+cnt[2])*y+(cnt[3]-cnt[0]-cnt[1]-cnt[2])*x);}else{ans=min(ans,(cnt[0]+cnt[1]+cnt[2]+cnt[3])/2*y+(cnt[0]+cnt[1]+cnt[2]+cnt[3])%2*x);}cout<<ans<<endl;return 0;
}

核心想法:分别记录 a^b!=c 的四种情况的种数

if (a[i]=='0'&&b[i]=='0') cnt[0]++;
if (a[i]=='0'&&b[i]=='1') cnt[1]++;
if (a[i]=='1'&&b[i]=='0') cnt[2]++;
if (a[i]=='1'&&b[i]=='1') cnt[3]++;

\(0\oplus0=1\oplus1=0,0\oplus1=1\oplus0=1\)那么这四种情况有一个潜在的性质

假设 \(a\oplus b=1\) ,将 \(a,b\) 中任一元素取反后,\(a\oplus !b=!a\oplus b=!1=0\)

特别的对于两个不同的 a,b 元素组,如果它们都不匹配 c ,我们一定可以交换其中某一位 \(0,1\) 来使得这两个都能匹配 c

首先计算如果全部都采用替换的办法,那么需要的代价总值为 x*(cnt[0]+cnt[1]+cnt[2]+cnt[3])

然后考虑可以交换的情况:对这四种情况按数量进行排序

  • 如果一种情况比其余情况都要多,那么只用考虑其余情况和最多的情况进行交换操作,剩下的就进行替换
  • 如果如果一种情况比其余情况要少,进行交换后要么刚好可以两两抵消,要么剩下一组,这一组单独进行替换即可(组数为奇数)
if (cnt[3]>cnt[0]+cnt[1]+cnt[2]){//cnt[3]>(cnt[0]+cnt[1]+cnt[2]+cnt[3])/2,大于总数的一半ans=min(ans,(cnt[0]+cnt[1]+cnt[2])*y+(cnt[3]-cnt[0]-cnt[1]-cnt[2])*x);
}else{ans=min(ans,(cnt[0]+cnt[1]+cnt[2]+cnt[3])/2*y+(cnt[0]+cnt[1]+cnt[2]+cnt[3])%2*x);
}

还有两题,挖坑后补

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

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

相关文章

2024.2.9 鲜花

超级入门的单位根反演?推歌 《壹雫空》 もしこの雨が上がっても 就算这场大雨就此停止 忘れずに歩いてくよ 我也将永不忘怀向前行 最初のひとしずくに 顔上げた今日の僕を 那抬头仰望最初一滴雨滴的今天的我 透明な傘で作る ひとり分だけの世界 透明的伞创造出的一人份…

2.9 实现安卓界面跳转

通过今天的学习实现了安卓程序界面的跳转web端出现的问题已经基本解决 今天学习了button的使用和@string字符串文本的使用

The Journey of Hailiang Winter Camp 2025

【洛谷专栏】。 前言 THUWC 2025 游记。 胸牌也是牌,倒一也是一,能去就是赢。 正文 2025.1 1.15 大晚上被叫到教练房间去训话,得知了一些非常重要的信息。 这次我们学校五个人仅有两个银,理论上勉强还看的过去,但是我们成了打的最差的一届。 @Cczzyy20150005 的分数差已知…

并发编程 - 线程同步(六)之锁lock

lock是C#中的线程同步互斥锁,使用时需避免锁定this、公共对象、字符串和非readonly对象,小心锁定静态对象。锁定不当易导致同步问题,示例代码和源码在代码库。通过前面对Interlocked类的学习,相信大家对线程同步机制有了更深的理解,今天我们将继续需要另一种同步机制——锁…

解读 DeepSeek-R1 论文 - 通俗易懂版

引言:让 AI 学会"思考"的新突破 在近年来的人工智能浪潮中,大型语言模型(LLM)如 ChatGPT 已经能回答各种问题,但它们在复杂推理方面仍有不足。所谓复杂推理,比如解决奥数难题、编写复杂代码或进行多步逻辑推导,这些都相当于让 AI "动脑筋"思考多步。…

2025多校冲刺省选模拟赛10

过于困难,直接放弃2025多校冲刺省选模拟赛10\(T1\) A. 电车 \(5pts\)直接化简成质因数分解的形式,因质因数分解是唯一的,故可以只考虑下标为质数处的值交换。容易发现 \(2p_{1},2p_{2}>n\) 的质数 \(p_{1},p_{2}\) 交换后不会影响合法性,考虑进一步扩展。对着指数确定范…

DESTRUCTION OI(退役前要做的 100 件事)

【洛谷专栏】。 这几天会慢慢更新的,致我即将结束的 OI 旅程。 每一个事应该都会图文并茂展开写,也算是作为我回忆录的一部分(?这也给了我另外一个思路。 更新进度 -> 100。给自己起个 ID ✓cjh20090318/Chen_Jinhui,这两个应该是我最常用的 ID。微信:cjh20090318 QQ:…

linux命令操作以及常见环境部署

文档对应的视频来自bibi 黑马 Linux基础命令 Linux的目录结构/,根目录是最顶级的目录了 Linux只有一个顶级目录:/ 路径描述的层次关系同样适用/来表示 /home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txtls命令 功能:列出文件夹信息 语法:ls [-l …

题解 [ARC127C] Binary Strings

【洛谷专栏】。 题意 给出 \(n,x\),请求出二进制下 \([1,2^n-1]\) 中字典序第 \(x\) 小的数是什么。 分析 从样例观察出每一个数的第一个字符都是 \(1\),然后画出 \(n=3\) 的树。节点即第 \(x\) 小的终止位置,边权从上到下依次表示二进制位。 顺着树从上往下,设当前节点在第…

[图形绘制/流程图] Mermaid : 开源的低代码图形绘制语言、协议及工具

概述:MermaidMermaid‌是一种基于Javascript的、开源的文本驱动图表生成工具/绘图工具,,使用类似于Markdown的低代码语法,它允许用户使用简单的文本语言来创建各种类型的图表,如流程图、时序图、甘特图和饼状图等。https://github.com/mermaid-js/mermaid https://mermaid…

SFM(Structure from Motion)总结(一)

什么是SFM? SFM(Structure from Motion)即运动结构恢复,通过给出多幅图像及其图像特征的一个稀疏对应集合,从而估计3D点的位置,这个求解过程通常涉及3D几何(结构)和摄像机姿态(运动)的同时估计。如何求解相关参数? 从图中可以得出,我们需要求解的主要内容有两个,一…

virt-manager 创建 Linux 虚拟机

上传 iso 到宿主机 ls -l /data1/iso/ total 4422912 -rw-r--r-- 1 root root 1774077952 Jan 22 08:51 ctyunos-2.0.1-210625-x86_64-dvd.iso -rw-r--r-- 1 root root 2754981888 May 7 2024 ubuntu-24.04-live-server-amd64.iso 运行 virt-manager virt-manager创建虚拟机 …