2021.12.10--《21-22-1蓝桥训练8》
Posted 斗奋力努
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.12.10--《21-22-1蓝桥训练8》相关的知识,希望对你有一定的参考价值。
2021.12.10–《21-22-1蓝桥训练8》
前话
这篇题解感觉就是提供一下代码,题目难度应该还没有达到省赛难度
之后的蓝桥题解有时间的话还是会再写的
题目
1、试题 算法训练 素因子去重
思路:质因数分解
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,p=1;
int main()
cin>>n;
for(ll i=2;i*i<=n;i++)
if(n%i==0)
p*=i;
while(n%i==0) n/=i;
if(n>1) p*=n;
cout<<p<<"\\n";
2、试题 算法训练 小生物的逃逸
思路:
就是问每个点在多少个球内,直接拿每个点去跟所有球的球心计算距离,距离小于该球的半径,就说明在这个球内,答案加1。
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m,ans[N];
struct Circle
double x,y,z,r;
cir[N];
double get_dist(double x,double y,double z,double nx,double ny,double nz)
double dx=x-nx;
double dy=y-ny;
double dz=z-nz;
return sqrt(dx*dx+dy*dy+dz*dz);
int main()
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
double x,y,z,r;scanf("%lf%lf%lf%lf",&x,&y,&z,&r);
cir[i]=x,y,z,r;
for(int i=1;i<=m;i++)
double x,y,z;scanf("%lf%lf%lf",&x,&y,&z);
int num=0;
for(int j=1;j<=n;j++)
double nx=cir[j].x,ny=cir[j].y,nz=cir[j].z,nr=cir[j].r;
if(get_dist(x,y,z,nx,ny,nz)<nr) num++;
ans[i]=num;
for(int i=1;i<=m;i++) printf("%d%c",ans[i],i==m?'\\n':' ');
return 0;
3、试题 算法训练 找零钱
思路:
碰到25,25数量+1
碰到50,25数量-1,50数量+1
碰到100,有50就用一张50和一张25,否则用三张25
最后判断25和50数量是否为非负数就行了。
#include<bits/stdc++.h>
using namespace std;
int n,nu25,nu50,nu100;
int main()
scanf("%d",&n);
for(int i=1;i<=n;i++)
int now;scanf("%d",&now);
if(now==25) nu25++;
else if(now==50)
nu25--;
nu50++;
else
if(nu50>0)
nu25--;
nu50--;
else
nu25-=3;
if(nu25>=0&&nu50>=0) puts("YES");
else puts("NO");
return 0;
4、试题 算法提高 研究兔子的土豪
思路:矩阵快速幂模板题(自学)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1007;
ll n;
struct mat
ll a[3][3];
;
mat ans;
mat mulit(mat a,mat b,ll mod)
mat c;
memset(c.a,0,sizeof(c.a));
for(ll i=0;i<2;i++)
for(ll j=0;j<2;j++)
for(ll k=0;k<2;k++)
c.a[i][j]+=a.a[i][k]*b.a[k][j];
c.a[i][j]%=mod;
return c;
mat pow(mat a,ll k,ll mod)
mat res;
memset(res.a,0,sizeof(res.a));
res.a[0][0]=res.a[1][1]=1;
while(k)
if(k&1) res=mulit(res,a,mod);
a=mulit(a,a,mod);
k>>=1;
return res;
int main()
scanf("%lld",&n);
if(n==1||n==2) puts("1");return 0;
mat c;
c.a[0][0]=1,c.a[0][1]=1;
c.a[1][0]=1,c.a[1][1]=0;
ans=pow(c,n-2,mod);
ll x=(ans.a[0][0]+ans.a[1][0])%mod;
printf("%lld\\n",x);
return 0;
5、试题 历届试题 子串分值和【第十一届】【省赛】【B组】
思路:(之前好像考过)
计算每个字符对答案的贡献就行了。
对于第i个位置的字符k,其可以分成两部分,
一部分是到上一个字符k所在位置截止
(
i
−
p
r
e
[
k
]
)
(i-pre[k])
(i−pre[k]),
一部分是一直到字符串的末尾
(
l
e
n
−
i
+
1
)
(len-i+1)
(len−i+1)
则第i个位置的贡献为
(
i
−
p
r
e
[
k
]
)
∗
(
l
e
n
−
i
+
1
)
(i-pre[k])*(len-i+1)
(i−pre[k])∗(len−i+1),累加一下就是总贡献了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll sum,pre[N];
char s[N];
int main()
scanf("%s",s+1);
ll len=strlen(s+1);
for(ll i=1;i<=len;i++)
ll idx=s[i]-'a';
sum+=(i-pre[idx])*(len-i+1);
pre[idx]=i;
printf("%lld\\n",sum);
6、试题 算法训练 活雷锋
思路:
判断是否有16出现就行了
#include<bits/stdc++.h>
using namespace std;
bool flag;
int main()
for(int i=1;i<=4;i++)
for(int j=1;j<=5;j++)
int x;scanf("%d",&x);
if(x==16) flag=true;
if(flag) puts("yes");
else puts("no");
return 0;
以上是关于2021.12.10--《21-22-1蓝桥训练8》的主要内容,如果未能解决你的问题,请参考以下文章