寒假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;
}
如有错误欢迎指正。