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]) (ipre[k])
一部分是一直到字符串的末尾 ( l e n − i + 1 ) (len-i+1) (leni+1)
则第i个位置的贡献为 ( i − p r e [ k ] ) ∗ ( l e n − i + 1 ) (i-pre[k])*(len-i+1) (ipre[k])(leni+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》的主要内容,如果未能解决你的问题,请参考以下文章

21-22-1蓝桥训练9

2021.10.22--《21-22-1蓝桥训练3》

2021.10.29--《21-22-1蓝桥训练4》

2021-11-12--《21-22-1蓝桥训练6》

21-22-1蓝桥训练4

21-22-1蓝桥训练1