1. 程式人生 > 其它 >寒假c++學習第三彈——列舉法(2021.01.25)

寒假c++學習第三彈——列舉法(2021.01.25)

技術標籤:c++

寒假c++學習第三彈——列舉法(2021.01.25)

目錄

1.四平方和

2.裝飾效果

3.雙截棍


1.四平方和

題目描述:

四平方和定理,又稱拉格朗日定理:每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表示為4個數的平方和。

比如:5 = 0² + 0² + 1² + 2²;7 = 1² + 1² + 1² + 2²;則對於一個給定的正整數n,可以表示為n = a² + b² + c² + d².你需要求出字典序最小的一組解a,b,c,d。字典序大小:從左到右依次比較,如果相同則比較下一項,直到有一項不同,較小的一方字典序更小,反之字典序更大,所有項均相同則二者字典序相同。

輸入格式:

程式輸入為一個正整數N(1 <= N <= 5000000).

輸出格式:

輸出4個非負整數a, b, c, d, 中間用空格分開。

輸入樣例1:

5

輸出樣例1:

0 0 1 2

輸入樣例2:

12

輸出樣例2:

0 2 2 2

程式碼展示

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    int N, d;
    cin >> N;
    for(int a=0; a*a <= N; a++){
        for(int b=a; a*a + b*b <= N; b++){
            for(int c=b; a*a + b*b + c*c <= N; c++){
                d = sqrt(N - a*a - b*b - c*c);
                if(a*a + b*b + c*c + d*d == N){
                    cout << a << " " << b << " " << c << " " << d << endl;
                    return 0;
                }
            }
        }
    }
    return 0;
}

2.裝飾效果

題目描述:

小明在美術課上給馬上要過生日的媽媽做了張賀卡,為了裝飾這張賀卡,小明買了一條綵帶,但是綵帶上並不是所有顏色小明都喜歡,於是小明決定裁剪這條綵帶,以取得最好的裝飾效果。

現已知綵帶由 n 種不同的顏色順次相接而成,而每種顏色的裝飾效果用一個整數表示(包括正整數,0,或負整數),從左到右依次為 a_1, a_2,..., a_n,小明可以從中裁剪出連續的一段用來裝飾賀卡,而裝飾效果就是這一段上各個顏色裝飾效果的總和,小明需要選取裝飾效果最好的一段顏色來製作賀卡(取該段顏色數值之和的最大值)當然,如果所有顏色的裝飾效果都只能起到負面的作用(即 a_i<0),小明也可以放棄用綵帶來裝飾賀卡(獲得的裝飾效果為 0)。

輸入格式:

輸入資料包括兩行:第一行是一個整數n,表示才帶上顏色的個數,第二行有n個整數,它們依次為a1, a2, ……, an(1 <= n <= 1000)。

輸出格式:

輸出資料只有一個整數,表示賀卡最多能獲得多少裝飾效果。

輸入樣例:

5

-1 2 -1 2 -1

輸出樣例:

3

程式碼展示

//最大連續子區間
#include <iostream>
using namespace std;
int a[1005];
int main(){
    int n, sum, ans;
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> a[i];
    }
    sum = 0;
    ans = 0; //設定一個最小和值
    for(int i=0; i<n; i++){
        sum = 0;
        for(int j=i; j<n; j++){
            sum += a[j];
            if(sum > ans){
                ans = sum;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

3.雙截棍

題目描述:

小剛想買兩根雙節棍,左手一根右手一根。他到商店裡,發現共有 n(2\leq n\leq 100)根雙節棍,第 i根的長度為 L_i1\leq L_i\leq 10000)。他希望買下的兩根雙節棍的長度差儘可能小,請你程式設計幫他找到兩根最合適的雙節棍,並輸出最小的長度差值。

輸入格式:

第一行:一個整數 n,表示商店裡出售雙節棍的數量。

第二行:n 個正整數,用空格分開,第 i 個數 L_i表示第 i 根雙節棍的長度。

輸出格式:

輸出只有一個整數,為兩根雙節棍的長度差的最小值。

輸入樣例:

5

輸出樣例:

3 4 1 6 8

程式碼展示

#include <iostream>
#include <cmath>
int L[105];
using namespace std;
int main(){
    int n,ans;
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> L[i];
    }
    ans = 10000; //設一個最大差值
    for(int i=0; i<n; i++){
        for(int j=i+1; j<n; j++){
            if(L[i] >= L[j]){
                if(L[i] - L[j] < ans){
                    ans = L[i] - L[j];
                }
            }else{
                if(L[j] - L[i] < ans){
                    ans = L[j] - L[i];
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}

如有錯誤歡迎指正。