偶数加成记
发布时间: 2018年4月17日 19:36 最后更新: 2018年4月18日 16:47 时间限制: 1000ms 内存限制: 128M
描述
小A这里有n个整数。小A想要得到这n个整数最大的偶数和(即该和为偶数),每个整数最多只能加一次。请你计算出最大的这个值。
输入
输入包含多组。输入的第一个数为一个n(1<=n<=100000)。下一行包括xyb的n个整数,以空格隔开。每个整数的范围为1~10^9。
输出
请输出最大的偶数和。
样例输入1
3 1 2 3
样例输出1
6
样例输入2
5 999999999 999999999 999999999 999999999 999999999
样例输出2
3999999996
提示
大家注意数据范围,本题需要用long long才能过。
题目没有要求,该和为连续和!!!大家注意审题啊!!!
———————————————————————————————————————————————————失败了N多次... 各种wrong Answer 以下为AC代码
#include <cstring>
#include <iostream>
#include <algorithm>
#define Max 100010
using namespace std;
long long a[Max];
bool compare(long long a,long long b)
{
return a>b;
}
int main()
{
int n;
while (cin>>n)
{
int count=0;
long long sum = 0;
for (int i = 1; i <=n; i++)
{
long long x;
scanf("%lld", &x);
if (x & 1)
a[count++]= x;
else sum += x;
} //偶数相加一定会得到偶数,所以先把偶数加起来,把奇数存到一个数组中
sort(a, a + count, compare); //将所有奇数元素从大到小排起来
if (count & 1) //如果有奇数个奇数,则加奇数减一个奇数元素
{
for (int i = 0; i <count - 1; i++)
sum +=a[i];
}
else
{
for (int i = 0; i <count; i++)
sum +=a[i]; //否则,加偶数个奇数,仍然是偶数
}
cout<<sum<<endl;
}
return 0;
}
思路已经在注释中标出;
下面是标程:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
long long sum=0;
long long flag=1e9+1;//flag等于极大值
while(n--)
{
long long pn;
scanf("%lld",&pn);
sum+=pn;
if(pn%2)//如果pn是奇数
flag=min(flag,pn);
}
printf("%lld\n",sum%2?sum-flag:sum);//如果是奇数,则最后减去最小的奇数即可,如果是偶数则直接输出
}
return 0;
}
标程的方法和思路以及代码量都很佳,学习一个!