最近做了剑心互娱23届春招笔试的第二题,当时没有写出来。下来后想了想代码,于此记录。
题目:求所有大小对之和
题目:(大概是)有一个长度为n的数组a。若假设i<k,a[i]<a[k],并且在数组中a[k]之后的元素都小于a[k].则称a[i]+a[k]为一个大小对。试求出数组a中所有大小对之和。(尽量使用更为高效的算法。)
思路:首先用双重循环找到数组中可能存在的a[k],可以用这个条件找到:满足a[k]之后的元素都要小于a[k]。
代码及详细注释如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
long long CalcTotal(vector<int>& a) {
long long sum = 0L;//最后所有大小对之和
int g = 0;//记录每个大小对中的a[k]位置的数组下标
int flag = 1;//用做判断
for (int i = 0; i < a.size(); i++) {//双重循环寻找可能的a[k]位置
int m = a[i];
for (int j = i + 1; j < a.size(); j++) {
if (m < a[j]) { //若是发现在数组中m的后面还有元素比m小,即不是我们要寻找的a[k],将flag置0,退出本次循环。
flag = 0;
break;
}
}
if (flag == 1) {//若是flag依然为1,则表明本次外层循环的m是我们要找的a[k]
g = i;//记录a[k]的位置即为i
for (int k = 0; k < g; k++) {
if (a[k] < a[g]) {
long long count = a[g] + a[k];//循环累加统计sum即大小对之和
sum += count;
}
}
}
flag = 1; //将flag重置为1,防止下一次循环出现错误
}
if (g == 0) { //即sum=0,数组中没有不存在大小对
return sum;
}
return sum;
}
int main() {
vector<int>p;
int n;
int i = 0;
cin >> n;//输入元素个数
int m;
for (int i = 0; i < n; i++) {
cin >> m;
p.push_back(m);
}
long long s = CalcTotal(p);
cout << s;
}
测试:
输入: n=6
vector<int>p={1,7,3,5,4,3}
输出:
38
欢迎指正~