牛客2025秋季算法编程训练联赛2-(基础组提升组)

news/2025/10/24 0:30:33/文章来源:https://www.cnblogs.com/usedchang/p/19161903

A.做游戏


原题链接

解题思路

尽可能多的使牛牛获胜,那么出石头,剪刀,布三种都取获胜的最大可能,对于石头:牛牛出的石头数量与牛可乐出的剪刀数量,剪刀和布亦然
note:注意c++开 long long

AC code

void solve(){ll a,b,c;ll x,y,z;cin>>a>>b>>c;cin>>x>>y>>z;cout<<min(a,y)+min(b,z)+min(c,x)<<endl;
}

B.排数字


原题链接

解题思路

贪心的数字串中的616全部提出来,然后以61616...的顺序排下去,发现答案是 min((6的数量-1),1的数量)。

AC code

void solve(){int n;cin>>n;string s;cin>>s;vector<int>mp(10);for(char c:s) mp[c-'0']++;cout<<max(min(mp[6]-1,mp[1]),0)<<endl;
}

C.判正误


原题链接

解题思路

快速幂,没啥好说的,对于单一模数冲突概率很大,本题需要采用多模技术,但是题主赛时单模1234567891水过去了
Note:快速幂需要处理负数幂不方便,要先把所有数归一化为0~mod-1内的数 ,o^o

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const ll mod=1234567891LL;
vector<ll>Mod={998244353,2,3,5,11,13,1234567891LL};
ll q_pow(ll a,ll b,ll mod){a=(a%mod+mod)%mod;ll s=1;while(b){if(b&1){s=s*a%mod;}b>>=1;a=a*a%mod;}return s;
}
void solve(){ll a,b,c,d,e,f,g;cin>>a>>b>>c>>d>>e>>f>>g;bool F=true;for(ll mod:Mod){ll s1=q_pow(a,d,mod),s2=q_pow(b,e,mod),s3=q_pow(c,f,mod);ll s=((s1+s2)%mod+s3)%mod;F&=(s==(g%mod+mod)%mod);}if(F) cout<<"Yes"<<endl;else cout<<"No"<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);int T=1;cin>>T;while(T--) solve();return 0;
}

D.数三角


原题链接

解题思路

暴力枚举三个点 然后用向量叉积判定是否共线,再根据余弦定理或者向量点积判定是否存在钝角。

AC code

void solve(){int n;cin>>n;vector< pair<int,int> >res(n+1);for(int i=1;i<=n;i++) cin>>res[i].first>>res[i].second;auto dis=[&](ll x,ll y) ->ll { return 1LL*x*x+1LL*y*y;};auto judge=[&](pair<int,int>a,pair<int,int>b,pair<int,int>c) ->bool {pair<int,int>w={b.first-a.first,b.second-a.second};pair<int,int>t={c.first-a.first,c.second-a.second};return 1LL*w.first*t.second!=1LL*w.second*t.first;};ll ans=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){for(int k=j+1;k<=n;k++){if(!judge(res[i],res[j],res[k])) continue;//不共线的判定ll a=dis(res[i].first-res[j].first,res[i].second-res[j].second);ll b=dis(res[i].first-res[k].first,res[i].second-res[k].second);ll c=dis(res[k].first-res[j].first,res[k].second-res[j].second);ans+=(a+b<c);ans+=(b+c<a);ans+=(a+c<b);}}}cout<<ans<<endl;
}

E.做计数


原题链接

解题思路

\[\sqrt i + \sqrt j=\sqrt k \]

\[i+j+2\sqrt {i \times j} = k \]

而要满足这个等式存在两个条件:
1.\(i \times j \leq n\)
2.\({i \times j}\) 是一个完全平方数
那么就转化为了求解小于等于 n 范围内的完全平方数配对数了,暴力枚举平方数即可,复杂度$ O{(\sqrt n \times \sqrt n)}$
note:看到根号你忍得住不平方也是神人了!
bonus:本题可以通过筛做到更快

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
vector<int>p;
void Init(int n){for(int i=1;i<=n/i;i++){p.push_back(i*i);}
}
void solve(){ll n;cin>>n;int ans=0;for(auto &x:p){for(int i=1;i<=x/i;i++){if(x>n) break;if(x%i==0){ans+=(x/i!=i)*2+(x/i==i);}}}cout<<ans<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);Init(4e7+5);solve();return 0;
}

F.拿物品


原题链接

解题思路

简单博弈,考虑他们在争夺什么?在保证自己获得的得分比对手获得的得分大,拿走第 i 个位置的物品可以使 对手 永远 无法获得 \(b_i\) 的价值,并且自己一定可以获得 \(a_i\),按照 \(a_i+b_i\)排序后顺序贪心取得即为答案

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
struct node{int x,y,idx;
};
void solve(){int n;cin>>n;vector<int>a(n+1);vector<int>b(n+1);vector< node >res(n+1);for(int i=1;i<=n;i++) cin>>a[i],res[i].x=a[i],res[i].idx=i;for(int i=1;i<=n;i++) cin>>b[i],res[i].y=b[i];sort(res.begin()+1,res.end(),[&](node w,node t){return w.x+w.y>t.x+t.y;});queue<int>Q;for(int i=1;i<=n;i++) Q.push(res[i].idx);vector<int>ans1,ans2;bool cur=0;while(!Q.empty()){cur^=1;int u=Q.front();Q.pop();(cur)?(ans1.push_back(u)):(ans2.push_back(u));}for(auto &x:ans1) cout<<x<<' ';cout<<endl;for(auto &x:ans2) cout<<x<<' ';cout<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);solve();return 0;
}

C.算概率


原题链接

解题思路

简单概率dp,考虑前 i 个位置时 答对了 j 个 题目概率由 考虑前 i-1 个位置 答对了 j-1个题目或 j 个题目转移而来
note:感觉应该swap(基础场C,提高场C)

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int mod=1e9+7;
ll q_pow(ll a,ll b){ll s=1;while(b){if(b&1){s=s*a%mod;}a=a*a%mod;b>>=1;}return s;
}
void solve(){int n;cin>>n;vector<int>a(n+1);vector<ll>p(n+1);p[0]=1;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){vector<ll>nxtp(n+1);nxtp[0]=p[0]*(1-a[i]+mod)%mod;for(int j=1;j<=i;j++){nxtp[j]=(p[j-1]*a[i]%mod+p[j]*(1-a[i]+mod)%mod)%mod;}p=nxtp;}for(int i=0;i<=n;i++) cout<<p[i]<<' ';cout<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);solve();return 0;
}

D.施魔法


原题链接

解题思路

很容易注意到排序后可以使用区间 dp,前 i 个位置最少消耗魔力 由比 i 小的位置转移过来,具体方程为 $dp_i= \min_{j=0,i-j>=k}^{i-1} {(dp_j+a_i-a_{j+1},dp_i)} $,朴素枚举显然时 \(O(n^2)\) 的,在仔细注意一下发现把 \(dp_j-a_{j+1}\) 这个东西看成整个整体,每次枚举前缀最值,最后就可以得到一个 \(O(n)\)的正解了

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve(){int n,k;cin>>n>>k;vector<int>a(n+1);for(int i=1;i<=n;i++) cin>>a[i];vector<ll>dp(n+1,INT_MAX);dp[0]=0;sort(a.begin()+1,a.end());ll minl=INT_MAX;for(int i=1;i<=n;i++){if(i>=k) minl=min(minl,dp[i-k]-a[i-k+1]);dp[i]=min(dp[i],minl+a[i]);}cout<<dp[n]<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);solve();return 0;
}

E.建通道


原题链接

解题思路

位运算优先考虑拆位,发现如果存在某一位点权在序列中至少有一个数与他不同,那么我们可以把,记这一位为 i,
那么我们把所有 第 i 为1的数字与某个第 i 位为0 的数字 相连,
再把所有第 i 为 0 的数字与某个第 i 位 为 1 的数字相连,发现相连后一定一颗生成树,那么就有一个贪心的思路,从小到大枚举 发现第一位序列中有一位数与其不同时,就产生 1<<i*(n-1)的代价,可以证明这样代价一定最小,注意去重,因为 如果两个数相同连接他们产生的 lobit 显然是 0.

AC code

//Stop learning useless algorithms, go and solve some problems, learn how to use binary search.
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
void solve(){int n;cin>>n;vector<int>a(n+1);for(int i=1;i<=n;i++) cin>>a[i];sort(a.begin()+1,a.end());a.erase(unique(a.begin()+1,a.end()),a.end());n=a.size()-1;for(int j=0;j<=31;j++){bool bit=(a[1]>>j&1);for(int i=2;i<=n;i++){if(bit^(a[i]>>j&1)) {cout<<(1LL<<j)*(n-1)<<endl;return;}}}cout<<0<<endl;
}
int main(){cin.tie(0)->ios::sync_with_stdio(false);solve();return 0;
}

F.求函数


原题链接

解题思路

区间线段信息合并类题目,可以考虑线段树,发现其由一颗单点更新的线段树可以解决,考虑如何由子节点更新父节点
发现分别维护 k 与 b 即可
由子节点上传信息时
1.\(parent.k=lchild.k \times rchild.k\)
2.\(parent.b=lchild.b \times rchild.k+rchild.b\)
最后输出 k与 b之和即可
note:注意取模和开 long long

AC code

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define lc (p<<1)
#define rc (p<<1|1)
typedef long long ll;
const int mod=1e9+7;
struct Seg{struct S{int l,r;ll k,b;};int n;vector<S>tre;Seg(int n):n(n){tre.resize(n<<2);build(1,n,1);}pair<ll,ll> merge(pair<ll,ll>x,pair<ll,ll>y){return pair<ll,ll>{x.first*y.first%mod,(y.first*x.second%mod+y.second)%mod};}void pushup(int p){tre[p].k=tre[lc].k*tre[rc].k%mod;tre[p].b=(tre[rc].k*tre[lc].b%mod+tre[rc].b)%mod;}void build(int l,int r,int p){tre[p]={l,r,0,0};if(l==r) return;int mid=l+r>>1;build(l,mid,lc);build(mid+1,r,rc);pushup(p);}void upd(int idx,pair<ll,ll>k,int p=1){if(tre[p].l==tre[p].r){tre[p].k=k.first%mod;tre[p].b=k.second%mod;return;}int mid=tre[p].l+tre[p].r>>1;if(mid>=idx) upd(idx,k,lc);if(mid<idx) upd(idx,k,rc);pushup(p);}pair<ll,ll> qry(int l,int r,int p=1){if(l<=tre[p].l&&r>=tre[p].r){return {tre[p].k,tre[p].b};}pair<ll,ll>L={1,0};pair<ll,ll>R={1,0};int mid=tre[p].l+tre[p].r>>1;if(mid>=l) L=qry(l,r,lc);if(mid<r) R=qry(l,r,rc);return merge(L,R);}   
};
int main(){cin.tie(0)->ios::sync_with_stdio(false);int n,m;cin>>n>>m;vector< pair<ll,ll> >res(n);Seg S(n);for(auto &[x,y]:res) cin>>x;for(auto &[x,y]:res) cin>>y;for(int i=0;i<n;i++) S.upd(i+1,res[i]);while(m--){int op,idx;ll k,b;cin>>op;if(op==1){cin>>idx>>k>>b;S.upd(idx,pair<ll,ll>{k,b});}else {cin>>k>>b;pair<ll,ll>w=S.qry(k,b);cout<<(w.first+w.second)%mod<<endl;}}return 0;
}

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

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

相关文章

局域网共享一键通_v2.0.9.9

下载地址 https://lkj371.lanzoue.com/b00b54fz4b密码:5npq◀.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px…

newDay15

1.今天体育课挺累,休息半天 2.明天多学会 3.没啥问题

[Nginx] Nginx学习手册

[Nginx] Nginx学习手册$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");Grok生成(2025年10月24日00:06:27)Nginx 学习手册目录Nginx 是什么? 安装与启动 配…

如何降低信息化系统的构建成本? ——信息化系统省钱全攻略:从规划到运维的实用技巧

从规划、技术选型、采购、实施到运维五大环节切入,结合真实企业案例,揭秘如何通过需求精准定位、模块化设计、云服务替代、开源软件筛选、批量采购谈判、流程自动化等策略,有效降低系统全生命周期成本。特别提醒关注…

树链剖分/轻重链剖分

基础封装(配合线段树等数据结构使用) 本封装将线段树处理的部分分离,方便修改。支持模板题P3384 【模板】重链剖分/树链剖分的四个查询(链上查询/修改、子树查询/修改),建树时间复杂度 O(Nlog⁡N)\mathcal O(N\l…

C#编程时winform程序登陆记住密码和自动登录功能,关于App.config的问题及解决方案

一、问题起因及来由 最近由于自己工作需要,把丢了十几年没有用过的编程软件知识捡起来,虽然十几年了,但还是忘不了,还是喜欢自己敲代码,遇到问题后,体验解决问题的后的快感。 同时也喜欢看着自己敲出的一系列整齐…

2025.10.23总结

软考还有两周左右,得抓紧复习了,目前仅仅在网上找题库刷了一点电题,得快点看完知识点讲解后刷题,剩下一周就以刷题为主了。因为目前的时间不能以天算,加上上课的时间,写作业,写项目等待。用在复习上的时间,每天…

[C/C++] Linux 环境变量(C/C++ ver)

[C/C++] Linux 环境变量(C/C++ ver)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");Grok 生成(2025年10月23日23:53:07)🌟 Linux 环境变量(C/C++ ver)…

诗词大会day1

诗词大会day1$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");成语血脉偾(fen四声)张:形容情绪极度激动、兴奋,导致血液流动加速,血管膨胀的感觉。 如椽…

Day2超链接标签

超链接的作用是跳转到其他网页<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,…

Ai元人文构想:你喜欢黑箱与偏见

你喜欢黑箱与偏见 在这个被算法支配的时代,我们都在参与一场心照不宣的共谋——你爱黑箱,我恋偏见。 这不是什么难以启齿的秘密,而是我们在这个过度刺激的世界里生存下来的智慧。黑箱多么美妙,它把复杂的因果、矛盾…

企业微信 使用api批量处理群消息

好的,我们来详细讲解如何为企业微信创建API接口,以便实现批量发送等高级功能。 创建企业微信API接入的核心是为你的企业创建一个“自建应用”,然后获取这个应用的访问凭证。整个过程可以分为以下几个步骤:第一步:…

first game (1)

初步搭完场景跟人物一些tips:F5 运行 F8 退出运行 Ctrl+A 创建新子节点 Ctri+S 保存耗时≈一小时 明天继续

10月23日日记

1.今天上体育课。 2.明天学习英语 3.为什么哈希表的查询可以做到O(1)?

软件工程学习日志2025.10.23

目标:完成 MapReduce 词频统计程序的远程执行链路,支持用 java -jar 直接运行 RemoteRunner,并解决参数传递与 HDFS/SSH 连接问题。 结果:RemoteRunner 已增强为“更健壮的远程执行器”,能自动探测 HDFS、在无参数…

66ye

`import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision.transforms import Compose, ToTensor, No…

Gin笔记一之项目建立与运行

本文首发于公众号:Hunter后端 原文链接:Gin笔记一之项目建立与运行本篇笔记开始介绍 Golang 的 web 框架 Gin 的相关内容。 本系列笔记预计通过四到五篇笔记内容介绍 Gin 框架的核心内容,然后通过一个简单的示例介绍…

【题解】P14254 分割(divide)

想了想,感觉这道题还是总结一下为好。 这个题需要涉及大量证明,也是很恶心人了。 引理一:当第 \(1\) 个点选择了深度为 \(i\),那后续所有节点的深度就只能为 \(i\)。 证明:因为选择的点的深度是不降得,所以不能选…