题目一:
题目特点:多个数据枚举
解法:使用多个for循环嵌套,然后使用if判断。
ou_fan的代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
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++) {
int d = sqrt(n - a*a + b * b + c * c);//d不用循环;因为已经限定了a,b,c;
//判断语句
if (a * a + b * b + c * c + d * d == n)
{
cout << a << ' ' << b << ' ' << c << ' ' << d << endl;
return 0;//只需找出一组,就可以关闭程序
}
}
}
}
}
题目二:
问题类型:最大子段和;
解法步骤:
step1:使用数组保存数据;
step2:使用两个for循环;外层表示起点的下标,内层表示子段求和情况。
从起点枚举到终点的和,然后再枚举第二个数据到终点的和,依次枚举。并且用一个变量保存最大值并且保证最大值更新。
ou_fan的代码:
#include<bits/stdc++.h>
using namespace std;
int arr[1005];//n<1000
int main() {
int n = 0;
cin >> n;//读入数据
for (int i = 1;i <= n;i++) {
cin >> arr[i];
}
int max = arr[1];//用于记录最大值
int sum = 0;// 用于记录各个子段的和;
for (int i = 1;i <= n;i++) {
sum = 0;
for (int j = i;j <= n;j++) {//j=i代表了求和开始的下标更替 {
sum += arr[j];
if (sum > max) max = sum;//每做一次求和就要做一次判断
}
}
cout << max << endl;
return 0;
}
复杂度:O(n2)
题目三:
题目特点:差值求绝对值最小:使用大减小即可避免绝对值判断;也可以用abs()函数求绝对值和max比较
解题步骤:与上题类似;注意不要重复计算;
#include<bits/stdc++.h>
using namespace std;
int arr[1005];//n<1000
int main() {
int n = 0;
cin >> n;//读入数据
for (int i = 1;i <= n;i++) {
cin >> arr[i];
}
int min = abs(arr[1]-arr[2]);//用于记录最小值
for (int i = 1;i <= n;i++) {
for (int j = i + 1;j <= n;j++) {
if (abs(arr[j] - arr[i]) < min)
min = abs(arr[j] - arr[i]);
}
}
cout << min << endl;
return 0;
}