2020年lfyz演算法設計大賽賽後題解

No_wonder_發表於2020-12-02

這場是高一同學們的第一場考試呢
(事先做完題然後兩分鐘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);
}

相關文章