6月21日训练 (东北林业大学)(个人题解)

2024-06-24 08:36

本文主要是介绍6月21日训练 (东北林业大学)(个人题解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

  这次训练是大一大二一起参加的训练,总体来说难度是有的,我和队友在比赛时间内就写出了四道题,之后陆陆续续又补了了三道题,还有一道题看了学长题解后感觉有点超出我的能力范围了,就留给以后的自己吧。话不多说,上正文。

正文:

  Problem:A 幸运数字:

#include <bits/stdc++.h>
using namespace std;
int sum,ans;
int main()
{int n,t;cin>>n;for(int i=1;i<=n;i++){sum=0;t=i;while(1){sum+=t%10;if(t/10==0&&t%10==0)break;t=t/10;}if(i%sum==1) ans++;}cout<<ans<<endl;return 0;
}

简单的签到题,直接枚举判断就行了。

Problem:B 子数组和:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1010;
LL a[N];
int main() {int n, k;cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] += a[i - 1];}bool flag = 0;for (int i = 1; i <= n; i++) {for (int j = i; j <= n; j++) {LL res = a[j] - a[i - 1];if (res == k) {flag = 1;cout << i << " " << j;return 0;}}}cout << -1;
}

先做前缀和,在循环枚举即可。

Problem:C 搭积木(待补):

学长说这题需具备树状数组、线段树等任一种支持单点修改+区间查询的数据结构,以及二位偏序的相关知识。

也可以看看见我的队友写的记忆化搜索东北林业大学6.21训练补题-CSDN博客。

Problem:D 最大子序列:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10005];int dp1[10005],dp2[10005];
vector<int> low;
int main(){int n;while(cin>>n){int ans=0;for(int i=1;i<=n;i++){cin>>a[i];}dp1[1]=1;low.clear();low.push_back(a[1]);for(int i=2;i<=n;i++){if(a[i]>low.back())low.push_back(a[i]);else {*lower_bound(low.begin(),low.end(),a[i])=a[i];}dp1[i]=lower_bound(low.begin(),low.end(),a[i])-low.begin()+1;//cout<<dp1[i]<<endl;}//dp2[n]=1;low.clear();low.push_back(a[n]);for(int i=n-1;i;i--){if(a[i]>low.back())low.push_back(a[i]);else {*lower_bound(low.begin(),low.end(),a[i])=a[i];}dp2[i]=lower_bound(low.begin(),low.end(),a[i])-low.begin()+1;//cout<<dp2[i]<<endl;}for(int i=1;i<=n;i++){if(dp1[i]>1&&dp2[i]>1){ans=max(ans,2*min(dp1[i],dp2[i])-1);}else ans=max(1,ans);//if(dp1[i]<=dp2[i+1])ans=max(ans,2*dp1[i]);//if(dp1[i]>=dp2[i+1])ans=max(ans,2*dp2[i+1]);}//cout<<n<<" "<<ans<<endl;cout<<ans<<endl;}return 0;
}

解释这道题之前我要先吐槽一下出题人的语文水平,整个题干写的雨里雾里的,什么是前n+1个数和后n+1个数1 2 3 4 5 5 4 3 2 1这算不算一个长度为10的序列,这些题干和样例都没表示清楚。

这题有点像我之前写的合唱队形:算法基础精选题单 动态规划(dp)(递推+线性dp)(个人题解)-CSDN博客

这题与那题区别在于递增递减序列长度要一样且不为0(都不为0),如果只有一个数那长度为1。

所以我们依旧是求两次最长上升子序列,这里直接两层循环会超时,所以第二层循环我们用二进制来优化掉。

Problem:E 阿华找阿璐:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+500;
int prime[N],b[N];
int cnt=0,maxl=1e6+499;
int init(){memset(b,1,sizeof(b));b[0]=b[1]=0;for(int i=2;i<=maxl;i++){if(b[i]) prime[++cnt]=i;for(int j=1;j<=cnt&&prime[j]*i<=maxl;j++){b[prime[j]*i]=0;if(i%prime[j]==0) break;}}return 0;
}
int main()
{ios::sync_with_stdio(0);init();int t,m,f=0;cin>>t;while(t--){cin>>m;for(int i=1;i<10005;i++){if(prime[prime[i]]>=m){cout<<prime[prime[i]]<<endl;f=1;break;}}//if(f==0) cout<<"No"<<endl;}return 0;
}

先初始化素数数组,prime[i]表示第i个素数,prime[prime[i]]就表示两次去素数后该值的初始值,之后再枚举找到第一个大于 m 的数即可。

Problem:F 阿祥和阿华:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){int t;cin>>t;while(t--){ll ans=1;ll n;cin>>n;for(int i=2;i*i<=n;i++){int cnt=0;if(n%i==0){while(n%i==0){cnt++;n/=i;}ans*=(cnt*2+1);}}if(n>1)ans*=3;cout<<(ans+1)/2<<endl;}
}

这题用到了约数定理,原式可以变化为 n^2 = (n - x) * ( n - y)

即:求n^2的约数组合数,n^2的质因数与n的质因数相同,个数为n的两倍,所以我们先求n的质因数,原本求组合数的公式是循环乘(x+1),x,那么n^2的组合数就是循环乘(x*2+1)最后在乘个(1*2+1),因为大于sqrt(n)的质因数有且仅有一个(除1以外),所以最后有if(n>1)ans*=3;

最后因为(2,3)与(3,2)算同一组,所以答案要取取一半,又因为可能会出现(x,x)这一组不需除2的情况,所以我们最后要(ans+1)/2。

Problem:G 数字游戏:

#include<bits/stdc++.h>
using namespace std;
int a[3005];
int book[10005];
int main(){int n;while(cin>>n){memset(book,0,sizeof(book));int k;cin>>k;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){book[a[i]+a[j]]++;//cout<<a[i]+a[j]<<endl;}}int t=k;for(int i=10000;i>=0;i--){while(k>0&&book[i]>0){if(t==k)cout<<i;else cout<<" "<<i;k--;book[i]--;}}cout<<endl;}return 0;
}

用sort排序会超时,但这题数字范围不是很大,我们可以用桶排做,注意和的总数不一定大于m(因为这个卡了超级久)。

Problem:H 剪花布条:

#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;while(n--){string a,b;cin>>a>>b;int l=a.size()-b.size();if(l<0)l=0;int r=0,ans,res=0,cnt=0;for(int i=l;i<a.size();i++){ans=0;int x=i;for(int j=0;j<b.size()&&x<a.size();j++,x++){//cout<<a[x]<<b[j]<<endl;if(a[x]==b[j])ans++;else break;//cout<<ans<<endl;}//cout<<x<<" "<<ans<<endl;if(x==a.size())res=max(res,ans);}cout<<res<<endl;}return 0;
}

一开始看这数据范围我还以为暴力做不了,但测评数据估计不是很大,暴力也卡过去了。做法就是从头到尾两个循环遍历,太暴力了以至于我比赛时都不敢写。

后记:

  C题和队友讨论了一下发现好像能做,我再去看看这题吧。

这篇关于6月21日训练 (东北林业大学)(个人题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089647

相关文章

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注