寒假c++学习第三弹——枚举法(2021.01.25)

寒假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;
}

如有错误欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值