题解 P5990 【[PA2015]Kieszonkowe】

· · 题解

原题传送门。在窝的博客中食用更佳。

【 题意概括 】

输入一个正整数 n,随后输入 n 个数,求最大的偶数和。

【 思路 】

一种较简单的贪心思想。

首先把这些数全部加起来,若和为偶数则和就是我们要的答案。

否则(即和为奇数),就想办法减去一个最小的奇数使这个和变为最大的偶数。

敲代码前先想想:是如何出现不可能的情况的?

当和为偶数时肯定不会不可能。当和为奇数时呢?

再仔细想想?

没错!当 n=1 且唯一的那个数也为奇数时就不可能满足了!

最后,每次想到贪心都得在心里多问几遍自己:能保证这样做的正确性吗?

当然,这次的答案是:Yes.

那么,是时候上代码了!

【 代码+注释 】

#include<bits/stdc++.h>//万能头文件好 
using namespace std;
#define ll long long//个人习惯 
ll a[1000005];//数组最好放外面
int main(){
    ll n,ans=0,i;//先定义好,ans即答案,i为循环变量
    scanf("%lld",&n);//输入n
    for(i=1;i<=n;i++){
        scanf("%lld",&a[i]);//输入其它数
        ans+=a[i];//边读边加会快些(Maybe?
    }
    if(ans%2==0){//若和已经为偶数了
        printf("%lld\n",ans);//直接输出
        return 0;//提前结束程序
    }
    else{//否则
        if(n==1){
            printf("NIESTETY\n");//输出不可能的情况
            return 0;//提前结束程序
        }//这一步上文有解释
        sort(a+1,a+1+n);//用sort把最小的放前面,好找
        for(i=1;i<=n;i++){
            if(a[i]%2==1){//若是奇数
                printf("%lld\n",ans-a[i]);
                //输出总和减去这个数即为答案,前文有解释
                return 0;//提前结束程序
            }
        }
    }
    return 0;//over~
}

对了,由于作者自愿禁言,如果有建议请私信,否则无法回复您哦。

完结撒花~(疯狂暗示๑乛◡乛๑