题目描述
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中记录第一个奇数和偶数
判断前奇数减去后偶数大或是前偶数减去前奇数大,再用和减去小的值