1 条题解

  • 0
    @ 2025-8-24 22:16:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 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,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

    【 题意概括 】

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

    【 思路 】

    一种较简单的贪心思想。

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

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

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

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

    再仔细想想?

    没错!当 n=1n=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~
    }
    

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

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

    • 1

    信息

    ID
    4997
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者