1 条题解
-
0
自动搬运
来自洛谷,原作者为

MZY666
「It's time to see what I can do_To test the limits and break through.」搬运于
2025-08-24 22:16:16,当前版本为作者最后更新于2020-03-13 22:58:07,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
【 题意概括 】
输入一个正整数 ,随后输入 个数,求最大的偶数和。
【 思路 】
一种较简单的贪心思想。
首先把这些数全部加起来,若和为偶数则和就是我们要的答案。
否则(即和为奇数),就想办法减去一个最小的奇数使这个和变为最大的偶数。
敲代码前先想想:是如何出现不可能的情况的?
当和为偶数时肯定不会不可能。当和为奇数时呢?
再仔细想想?
没错!当 且唯一的那个数也为奇数时就不可能满足了!
最后,每次想到贪心都得在心里多问几遍自己:能保证这样做的正确性吗?
当然,这次的答案是: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~ }对了,由于作者自愿禁言,如果有建议请私信,否则无法回复您哦。
完结撒花~(疯狂暗示๑乛◡乛๑
- 1
信息
- ID
- 4997
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者