这场是高一同学们的第一场考试呢
(事先做完题然后两分钟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