2020年lfyz算法设计大赛赛后题解

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

春来

其实就是问 n n n个数的最大公因数 ( g c d ) (gcd) (gcd)

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

我这里提供 g c d 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 n n个数能凑出来最大的钱是 a a a(a之前的金额都能凑出来)。面临第 n + 1 n+1 n+1个数,如果他大于 a + 1 a+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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值