UOJ Logo No_wonder的博客

博客

赛后题解

2020-12-02 18:43:35 By No_wonder

这场是高一同学们的第一场考试呢 (事先做完题然后两分钟AK的高二的我们都是屑

春来

其实就是问$n$个数的最大公因数$(gcd)$。

方法是这样的,我们考虑三个数的情况,只需要先算前两个数的的$gcd$,然后用这个$gcd$去与第三个数匹配得到的$gcd$就是答案,扩展到n个数,只需要用$gcd$不断递推就可以

我这里提供$gcd$的写法,使用欧几里得算法就可以快速得到答案

#include<bits/stdc++.h>            //万能头,包含了常用的所有头文件
using namespace std;
int Exgcd(int x,int y)            //欧几里得算法,Exgcd真实含义是扩欧,感兴趣的同学可以自行了解 
{
    return y==0?x:Exgcd(y,x%y);    //递归求解 
}
int n,a[100];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    int ans=a[1];
    for(int i=2;i<=n;i++)        //前言说的递推 
    ans=Exgcd(ans,a[i]);
    printf("%d",ans);
    return 0;
}

关于Exgcd

彩sai羽毛球

这里介绍一种数据结构,栈。我们想象一个井,我们可以往里扔东西,往出拿东西。那么我们能访问到的就只有最后扔进去的元素(栈顶元素。 我们可以手写一个数组去模拟这个过程,但是我更倾向于使用STL容器

#include<bits/stdc++.h>
#include<stack>
using namespace std;
stack <int>a;                //STL中的栈容器 
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    int k;
    scanf("%d",&k);
    if(k==1)
        {
            int c;
            scanf("%d",&c);
            a.push(c);                //进栈 
        }
    if(k==2)
        {
            int c;
            scanf("%d",&c);
            for(int i=0;i<c;i++) 
            a.pop()    ;            //出栈 
        }
    if(k==3)
            printf("%d\n",a.top());    //栈顶元素 
    }

}

关于栈看这里吧

颓我家财

这道题思维难度还是可以的,我也交了三版代码才过(被long long卡了

我们考虑前$n$个数能凑出来最大的钱是$a$(a之前的金额都能凑出来)。面临第$n+1$个数,如果他大于$a+1$,那么我们就遇到了第一个凑不出的金额。所以只需要做一个前缀和就好。

#include<bits/stdc++.h>
#define ri register int
using namespace std;
long long a[100005];
long long n,sum;
int main()
{
    scanf("%lld",&n);
    for(ri i=1;i<=n;i++)
    scanf("%lld",&a[i]);
    for(ri i=1;i<=n;i++)
    {
        if(sum+1<a[i])
        {
            printf("%lld",sum+1);
            return 0;
        }
        sum+=a[i];
    }
    printf("%lld",sum+1);
}

我的blog

评论

NaCl
No_wonder 大佬放错链接了,那个是后台链接。No_wonder 的博客地址为 https://blog.csdn.net/m0_46207148。

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。