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