题解 P5990 【[PA2015]Kieszonkowe】
原题传送门。在窝的博客中食用更佳。
【 题意概括 】
输入一个正整数
【 思路 】
一种较简单的贪心思想。
首先把这些数全部加起来,若和为偶数则和就是我们要的答案。
否则(即和为奇数),就想办法减去一个最小的奇数使这个和变为最大的偶数。
敲代码前先想想:是如何出现不可能的情况的?
当和为偶数时肯定不会不可能。当和为奇数时呢?
再仔细想想?
没错!当
最后,每次想到贪心都得在心里多问几遍自己:能保证这样做的正确性吗?
当然,这次的答案是: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~
}
对了,由于作者自愿禁言,如果有建议请私信,否则无法回复您哦。
完结撒花~(疯狂暗示๑乛◡乛๑