最大奇数和

题目描述

LZY又来恶心人啦,在n个整数中,最多取k个整数,求最大和且和为奇数。

输入

本题有多组测试样例,输入一对正整数n (n<100000) 和 k (k<=n)。

紧接着跟着n个整数ai(-2147483648<=ai<=2147483647)题目保证至少有一个奇数。

输出

符合题意的最大奇数和。

样例输入

6 3
9 7 5 3 1 -1

样例输出

21
代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(int x,int y){
 return x>y;
}
int main(){
 long long n,k,a[100000];
 
 while(cin>>n>>k){
  long long sum=0,oushu=0,jishu=0;
  int b=0,c=0;
  int hououshu,houjishu,qianjishu,qianoushu,min;
  memset(a,0,sizeof(a));
  for(int i=0;i<n;i++)//输入数据 
   cin>>a[i];
  sort(a,a+n,cmp);//快排 
  for(int i=0;i<k;i++){//从大到小累加,并记录奇偶个数 
   sum+=a[i];
   if(a[i]%2==0){
    oushu++;
   }
   if(a[i]%2!=0){
    jishu++;
   }
  }
  if(jishu==0){//都是偶数的情况 
   sum=sum-a[k-1];
   for(int i=k;i<n;i++){
    if(a[i]%2!=0){
     sum+=a[i];
     jishu++; 
     break;
    }
   }
  }
  if(sum%2==0){//累加后结果是偶数的情况 
   for(int i=k;i<n;i++){
    if(a[i]%2==0&&b==0){
     b++;
     hououshu=a[i];
    }
    if(a[i]%2!=0&&c==0){
     c++;
     houjishu=a[i];
    }
    if(b==c==1)
     break;
   } 
   for(int i=k-1;i>=0;i--){
    if(a[i]%2==0&&b==1){
     b--;
     qianoushu=a[i];
    }
    if(a[i]%2!=0&&c==1){
     c--;
     qianjishu=a[i];
    }
    if(b==c==0)
     break;
   }
   if((qianjishu>=0&&hououshu>=0&&qianoushu>=0&&houjishu>=0)||(qianjishu<=0&&hououshu<=0&&qianoushu<=0&&houjishu<=0)){
    if(qianjishu-hououshu>qianoushu-houjishu)
     min=qianoushu-houjishu;
    else
     min=qianjishu-hououshu;
   }else{
    if(qianjishu-hououshu>qianoushu-houjishu)
     min=qianoushu+houjishu;
    else
     min=qianjishu+hououshu;
   }
   sum-=min;
  } 
  cout<<sum<<endl;
 }
 return 0;
} 

思路
判断是否是奇数,如果是的话直接退出
不是的话记录0-k-1中最后一个奇数和偶数,再从k-n中记录第一个奇数和偶数
判断前奇数减去后偶数大或是前偶数减去前奇数大,再用和减去小的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值