此题代码本人时间超限 有没有聪明人教我简化 谢谢
三月好时节
三月是一个繁花似锦的季节是一个播种希望的季节。
为此TooY0ung决定对学生们进行开心的测试TooY0ung觉得学生一定也会非常开心。
TooY0ung随手在黑板上写了n个不一样的数字。
他要求学生可以从中随意选取两个不相同的数字如果两个数字的和是偶数就认定两个数字的和为“开心数”。
现在TooY0ung想知道“开心数”的最大值是多少。
输入
输入包含两行。
第一行输入一个数字n含义见题目描述。
第二行输入n个不同的数字ai。
输出
输出仅包含一行。
如果可以找到“开心数”则输出“开心数”的最大值。
如果没有“开心数”则输出-1。
输入样例 1
5
1 2 3 4 5
输出样例 1
8
输入样例 2
2
1 2
输出样例 2
-1
提示
关于样例1:
可以得到的和分别有:1+2=3 1+3=4 1+4=5 1+5=6 2+3=5 2+4=6 2+5=7 3+4=7 3+5=8
4+5=9。
其中“开心数”为:4 6 8。
“开心数”的最大值为8。
关于样例2:
可以得到的和只有:1+2=3
没有“开心数”输出-1。
数据范围:
对于35%的数据 2<=n<=100 0<=ai<=10^9。
对于100%的数据,2<=n<=2*10^5 0<=ai<=10^9。以下是本人代码
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
long long n,p=0,b[n],j[n],max=-1;
cin >> n;
for (int i=1;i<=n;i++) {
cin>>b[i];
}
for(int i=1;i<=n;i++) {
for(int k=i+1;k<=n;k++) {
j[p]=b[i]+b[k];
p++;
}
}
for(int i=0;i<p;i++) {
if(j[i]%2==0&&j[i]>max)max = j[i];
}
cout<<max;
return 0;
}
时间超限,教简化
不需要这么做,只要对输入的数字排序后从大到小枚举即可——要么是找两个奇数,要么是找两个偶数。
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int n;
cin >> n;
int numbers[n];
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
bubbleSort(numbers, n);
int evenSum = 0, oddSum = 0;
int evenCount = 0, oddCount = 0;
for (int i = 0; i < n; i++) {
if (numbers[i] % 2 == 0 && evenCount < 2) {
evenSum += numbers[i];
evenCount++;
} else if (numbers[i] % 2 != 0 && oddCount < 2) {
oddSum += numbers[i];
oddCount++;
}
if (oddCount > 2 && evenCount > 2) break;
}
if (oddCount < 2 && evenCount < 2)
{
cout << -1;
}
else if (oddCount == 2 && evenCount == 2)
{
cout << (evenSum > oddSum ? evenSum : oddSum);
}
else if (oddCount == 2)
{
cout << oddSum;
}
else
{
cout << evenSum;
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::ios::sync_with_stdio(false); // 提高输入输出的速度
int n;
std::cin >> n; // 输入数组大小
std::vector<int> b(n); // 使用std::vector代替普通数组,用于存储输入的整数
for (int i = 0; i < n; i++) {
std::cin >> b[i]; // 读取n个整数并存储在vector b中
}
int max = -1; // 初始化最大偶数和为-1
// 使用两重循环计算数组b中两两元素的和,并查找最大的偶数和
for (int i = 0; i < n - 1; i++) {
for (int k = i + 1; k < n; k++) {
int sum = b[i] + b[k]; // 计算两个元素的和
if (sum % 2 == 0 && sum > max) {
max = sum; // 如果和为偶数且大于当前最大值,则更新最大值
}
}
}
std::cout << max << std::endl; // 输出最大的偶数和
return 0;
}