寒假两周训练总结

news/2025/2/7 19:04:48/文章来源:https://www.cnblogs.com/dontian/p/18689155

1.codeforces
2.牛客寒假训练营(一)
3.牛客寒假训练营(二)
4.牛客寒假训练营(三)
5.牛客寒假训练营(四)
总的情况打的情况不好,在家有干扰还有事情较多,希望能更加保持专注,下一周更加进步有收获
这一周的问题发现的也不少,很多知识有些忘记了,还有对题目的分析和回忆学过的知识,细想起来真的很多,一点一点补回来
1.

A. Level Statistics
简单的模拟,细心一点,看清题目问的是什么,每一次是和上一次比较

点击查看代码
#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while(t--){int n;cin >> n;bool pd = true;int lp = 0, lc = 0;for(int i = 0; i < n; ++i){int p, c;cin >> p >> c;if(p < lp || c < lc){pd = false;}if(p < c){pd = false;}int dp = p - lp;int dc = c - lc;if(dp < dc){pd = false;}lp = p;lc = c;}if(pd){cout << "YES\n";}else{cout << "NO\n";}}return 0;
}

B. Middle Class
贪心,从最大开始取,直到不满足条件退出循环

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int v[1008611];int32_t main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while(t--){int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>v[i];}sort(v+1,v+1+n,greater<int>());int sum=0;int res=0;for(int i=1;i<=n;i++){sum+=v[i];if((1.00*sum/i)<k*1.00){break;}else{res++;}}cout<<res<<'\n';}return 0;
}

C. Circle of Monsters
因为 b 都是大于 0 的数,所以最优解肯定是先挑选一个敌人开始,然后按照顺序依次击杀,不难看出这样是最优的,那么找出第一个击杀的敌人成了这个题的突破口,我的第一反应是找到 a[ i ] 的最小值入手,但不幸的是这样做并不对,后来看到了数据范围给了提示,就恍然大悟了,想一下为什么 a 和 b 的数值都给到了 1e12 ,而不是正常的 1e9 或 1e5 呢,显然是需要进行某种操作,而不能超过 1e18 ,这相差了不到 1e6 的量级恰好就和敌人的数量 n 对应了起来,所以数据范围提示我们需要维护一个前缀和,这样一想我们因为只是第一个敌人的选择不一样,所以可以一层循环枚举起点然后维护最小值作为答案

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int v[1008611];
int d[1008611];
int32_t main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while(t--){int n;cin>>n;int minn=1e12;for(int i=0;i<n;i++){cin>>v[i]>>d[i];}int ans=0;for(int i=0;i<n;i++){ans+=v[i];ans-=min(v[(i+1)%n],d[i]);minn=min(minn,min(v[(i+1)%n],d[i]));}cout<<ans+minn<<'\n';}return 0;
}

D. Minimum Euler Cycle

茕茕孑立之影
找一个大于1e9的素数即可

点击查看代码
#include <bits/stdc++.h>
using namespace std;#define int long long
int v[1008611];int32_t main(){int t;cin>>t;while(t--){int n;cin>>n;int sum=1;int pd=0;for(int i=1;i<=n;i++){cin>>v[i];if(v[i]==1){pd=1;}}if(pd){cout<<-1<<'\n';}elsecout<<5201314789<<'\n';}
}

一气贯通之刃
判断是否存在只有两个节点是1度,其余节点都是2度

点击查看代码
#include <bits/stdc++.h>
using namespace std;#define int long long
int v[1008611];int32_t main(){int n;cin >> n;if (n == 1) {cout << -1 << '\n';return 0;}vector<tuple<int, int>> edges;vector<vector<int>> adj(n);vector<int> degree(n, 0);for (int i = 0; i < n - 1; ++i) {int u, v;cin >> u >> v;--u; --v;edges.emplace_back(u, v);adj[u].push_back(v);adj[v].push_back(u);degree[u]++;degree[v]++;}int snode = -1;int enode = -1;int cdo = 0;for (int i = 0; i < n; ++i) {if (degree[i] == 1) {cdo++;if (snode == -1) snode = i;else enode = i;}}if (cdo != 2) {cout << -1 << '\n';} else {cout << snode + 1 << " " << enode + 1 << '\n';}return 0;
}

双生双宿之决

点击查看代码
#include <bits/stdc++.h>
using namespace std;#define int long long
int v[1008611];
const int N=1e8+5;
bool vis[N];
int prime[6000000];
int cnt;int32_t main(){int t;cin>>t;while(t--){int n;cin>>n;set<int>st;int a,b;map<int,int>mp;for(int i=1;i<=n;i++){cin>>v[i];if(i==1){a=v[i];}else{if(v[i]!=a){b=v[i];}}mp[v[i]]++;st.insert(v[i]);}if(n%2==0&&st.size()==2&&mp[a]==mp[b]){cout<<"Yes\n";}else{cout<<"No\n";}}
}

井然有序之衡
贪心,我们可以先判断是否满足条件,利用等差数列的求和公式判断,然后把数组从小到大排列,看每个值与i差多少,是否满足即可

点击查看代码
#include <bits/stdc++.h>using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0);long long n;cin >> n;vector<long long> a(n);for(auto &x: a){cin >> x;}long long res = n * (n +1) /2;long long sq = accumulate(a.begin(), a.end(), 0LL);if(sq != res){cout << "-1\n";return 0;}sort(a.begin(), a.end());long long ans =0;for(long long i=0;i<n;i++){ans += abs(a[i] - (i+1));}cout << (ans /2) << "\n";return 0;
}

井然有序之窗
我们可以使用优先队列维护右端点最小的区间,对区间按左端点排序后,可以从前往后将左端点小于i 的区间加入优先队列,然后取出右端点最小的区间。

点击查看代码
#include <bits/stdc++.h>
using namespace std;struct node {int l;int r;int idx;};int main(){ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n;vector<node> v(n);for(int i=0; i<n; ++i){cin >> v[i].l >> v[i].r;v[i].idx = i;}sort(v.begin(), v.end(), [&](const node &a, const node &b) -> bool{if(a.l != b.l) return a.l < b.l;return a.r < b.r;});priority_queue<pair<int, int>, vector<pair<int, int>>,greater<pair<int, int>>> pq;vector<int> result(n, -1);int pos = 0;for(int i=1; i<=n; ++i){while(pos < n && v[pos].l <= i){pq.emplace(v[pos].r, v[pos].idx);pos++;}while(!pq.empty() && pq.top().first < i){pq.pop();}if(pq.empty()){cout << "-1";return 0;}auto [r, idx] = pq.top();pq.pop();result[idx] = i;}for(int i=0; i<n; ++i){if(result[i] == -1){cout << "-1";return 0;}}for(int i=0; i<n; ++i){cout << result[i] << (i!=n-1 ? ' ' : '\n');}return 0;
}
3. 这一场牛客打感觉区分太明显,不会做的题就是做不出来,我补的我不会的题

智乃的Notepad(Easy version)
我的思路差不多,但是只过了四分之一,后面可能状态思路有问题,想歪了,找公共前缀然后数学推导
全部字符串的长度和-排序后相邻字符串的lcp)*2-最长字符串长度。,也可以用字典树

#include<bits/stdc++.h>
using namespace std;const int M=1e5+10;
string a[M];
int n,m;int lcp(const string &A,const string &B)
{int i=0;while(i<A.size()&&i<B.size()&&A[i]==B[i]) i++;return i;
}int main()
{cin>>n>>m;for(int i=0;i<n;i++) cin>>a[i];sort(a,a+n);int mx=0,sum=0;for(int i=0;i<n;i++){sum+=(int)a[i].size()*2;if(i) sum-=lcp(a[i],a[i-1])*2;mx=max(mx,(int)a[i].size());}cout<<sum-mx;return 0;
}

智乃与数模

可以使用一种叫做整除分块/数论分块的技巧暴力枚举

#include <bits/stdc++.h>using namespace std;
typedef long long ll;int main()
{int N, K;cin >> N >> K;int L = 1, R = N;int val = 0, vtot = 0;while (L <= R){int mid = (L + R) / 2;int tot = 0;for (int l = 1, r; l <= N; l = r + 1){r = N / (N / l);int a = N - N / l * l;int k = (N / l);if (a < mid)continue;//cout << "a " << a << " " << mid << endl;tot += min((a - mid) / k + 1, r - l + 1);}//cout << "aaa " << mid << " " << tot << endl;if (tot >= K){L = mid + 1;} else{vtot = tot;val = mid;R = mid - 1;}}//cout << val << " ** " << vtot << endl;ll ans = 1LL * (K - vtot) * (val - 1);for (int l = 1, r; l <= N; l = r + 1){r = N / (N / l);int a = N - N / l * l;int k = (N / l);if (a < val)continue;int len = min((a - val) / k + 1, r - l + 1);//cout << "calc " << a << " " << k << " " << len << endl;ans += 1LL * (a * 2 - k * (len - 1)) * len / 2;}printf("%lld\n", ans);return 0;
}

D Tokitsukaze
字符串、贪心、分类讨论
分析题目根据C有下面结论
首尾相同的字符串一定是平衡的。
首尾不相同的字符串一定是不平衡的。
一个不平衡的字符串只有翻转首尾字符才可能变成平衡的。
一个平衡的字符串翻转除了首尾外的任意一个字符后依然是平衡的。

由于字符串可以重排,那么回文串就相当于是一种连连看,消除相同的字符。

如果一个字符在短字符串中出现了,在长的字符串中也出现了,那就将这个字符在两个字符串中各删除一个。

如果一个字符在短字符串中出现了,在长的字符串中没出现,那这个字符就无法消除,只能进行修改, 例如短的字符串为 "abc" ,长的字符串为 "abddf" ,我们可以重排后连起来变成 "abc | ddfba" ,实际上等效于 "c" 和 "ddf" 拼接成 "c | ddf" ,。 在用短的字符串尝试消除长的字符串后,长的字符串就残余了一些字母,这些残余的字母两两之间也可以相互抵消,最后字母个数为奇数的都会残余一个无法抵消的,记录为ans.
#include<bits/stdc++.h>using namespace std;const int M = 1e9 + 7;int main(){int T;cin >> T;while(T--){int n;cin >> n;string s;cin >> s;if(s.size() == 1){if(s == "?") cout << 2 << endl;else cout << 1 << endl;continue;}s = " " + s;int cnt = ranges::count(s, '?');int ksm = 1;for(int i = 1; i <= cnt; i++){ksm *= 2;ksm %= M;}int ksm_1 = 1;for(int i = 1; i <= cnt - 1; i++){ksm_1 *= 2;ksm_1 %= M;}int ans = 0;if(s[1] != '?' && s[n] != '?'){if(s[1] == s[n]) ans = 1ll * ksm * (n - 2) % M;else ans = ksm * 2 % M;}else ans = 1ll * ksm_1 * n % M;cout << ans << endl;}
}

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

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

相关文章

Docker搭建Jenkins并共用宿主机Docker部署服务(一)搭建Jenkins及插件配置 -转载

前言 公司项目多忙着开发,所有项目服务都是博主一个个部署的,时间久了也是心累,所以抽时间把Jenkins部署上,之后让其他开发人员自己部署(让我解脱吧!!)。 部署Jenkins容器 Docker安装就不在赘述了,可以看我之前的文章(懒了);直接开始拉取jenkins镜像。 拉取镜像 docker…

Adam优化器、其与策略梯度法结合

一.Adam优化器旨在根据历史梯度信息来调整每个参数的学习率,从而实现更高效的网络训练。Adam算法的核心思想是同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于0。Adam优化器是一种梯度下降…

ES6-3 Babel转码器

Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在老版本的浏览器执行。这意味着你可以用ES6的方式编写程序,又不用担心现有的环境是否支持浏览器支持性查看:https://caniuse.com/Babel官网:https://babeljs.io/ 1、转码示例原始代码用了箭头函数,Babel将…

c++专题三

C++专题三学习日记 stack(栈) 仅支持查询或删除最后一个加入的元素(栈顶元素)函数名 功能 时间复杂度top() 返回栈顶元素 O(1)empty() 判断是否为空 O(1)size() 返回元素个数 O(1)push() 在栈顶插入元素 O(1)pop() 删除栈顶元素 O(1)queue(队列) 仅支持查询或删除第一个加入的…

mower 明日方舟自动化脚本的docker镜像构建以及使用

一、前言碎碎念 由于我目前使用的arm开发板,默认没有启用桌面可视化环境,而且又不想装一大堆软件和包影响实机环境,所以使用docker进行mower的镜像构建以及使用 测试平台如下,x64和arm64平台均已经过构建以及使用测试二、mower构建以及部署过程 接下来使用arm平台ubuntu进行…

我的公众号接入AI了

背景 近期,DeepSeek等AI应用的爆火让我深刻意识到AI技术在各个领域中的巨大潜力。为了更好地拥抱AI,我决定在我的所有工作生活场景中尽可能地加入AI,以提升效率和体验。 作为拥抱AI的一环, 我选择了为我的微信公众号接入AI功能,使其能够智能回复用户消息,提供更丰富的交互…

大模型时代的软件进化论:恐龙式软件 vs. 猴群式软件

春节期间,IT圈内两件大事持续发酵,一件是中国大模型DeepSeek R1的开源震动全球AI界,让中国科技界扬眉吐气,廉价大模型走入千家万户;另一件是SAP被客户居然之家告上法庭,要求索赔590万开发费用和1700万软件费用,最终法院判SAP退还350万研发费用。这两件事的背后,实际上映…

xtrabackup 命令备份

Percona XtraBackup 安装下载地址: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-32/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.35-32.1.el8.x86_64.rpm 官方YUM安装说明: Percona 版本和 YUM - Percona XtraBackup在…

React—03—类组件中事件处理函数的this绑定、事件处理函数的传参;jsx的条件判断渲染;jsx的循环渲染

零、如何给html元素加事件监听 1.原生方式:通过querySelector()方法,捕捉到元素,比如说button元素,然后通过btn.onclick = () =>{}或者通过btn.addEventListensers(click, ()=>{})的方式 2.vue的方式,在元素上使用v-on指令,比如@click 3.react方式,在元素上使用事…

巧用通义灵码,提升前端研发效率

本次分享,主题是利用通义灵码提升前端研发效率。分享内容主要包括以下几部分:首先,我将从前端开发的角度介绍对通义灵码的基本认识;其次,我将展示通义灵码在日常研发中的应用案例;然后,我将通过实例说明,良好的设计能够显著提升通义灵码的效果。在第四个部分,我将介绍…

linux服务器离线安装ollama

一、前言 公司服务器在线安装ollama总是超时连接不上,想着本质就是个安装包,离线安装也可以。固有了这样的一篇博客记录一下。 二、流程 1、查看服务器cpu架构 执行指令 lscpu# x86_64 CPU选择下载ollama-linux-amd64 # aarch64|arm64 CPU选择下载ollama-linux-arm642、下载对…

数字孪生与智慧工厂完美融合,推动智能制造新时代

随着工业4.0和智能制造的浪潮席卷全球,数字孪生技术成为了现代工业发展的重要驱动力。数字孪生,作为一种能够在虚拟环境中精确再现物理实体的技术,通过实时数据的流动和反馈,创建了一个高度仿真的“数字模型”,而这一模型不仅仅停留在静态的模拟阶段,而是与现实世界保持实…