寒假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,或負整數),從左到右依次為 ,小明可以從中裁剪出連續的一段用來裝飾賀卡,而裝飾效果就是這一段上各個顏色裝飾效果的總和,小明需要選取裝飾效果最好的一段顏色來製作賀卡(取該段顏色數值之和的最大值)當然,如果所有顏色的裝飾效果都只能起到負面的作用(即 ),小明也可以放棄用綵帶來裝飾賀卡(獲得的裝飾效果為 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()根雙節棍,第 i根的長度為 ()。他希望買下的兩根雙節棍的長度差儘可能小,請你程式設計幫他找到兩根最合適的雙節棍,並輸出最小的長度差值。
輸入格式:
第一行:一個整數 n,表示商店裡出售雙節棍的數量。
第二行:n 個正整數,用空格分開,第 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;
}
如有錯誤歡迎指正。