题目大意:给出n个数,从中选取k个,使得乘积最大,并且尽量使和最大

分析:首先按照数的绝对值大小排序。然后就要分三大类情况讨论:

(1)前k个中选到0:如果选到0的话,乘积一定是0,所以尽量选大的数,让和变大。

(2)前k个中选到负数的个数为偶数:这样的话直接输出答案(一定为最优解)

(3)前k个中选到的负数个数为奇数:这类情况比较复杂,还要分成两个子类:

a)k个中没有正数:

如果换正数:优先用正数替换最小的负数;否则注定乘积为负数或者0:选最大的k个。

b)k个中有正数:

还有正数和负数:比较最优; 只有正数:选用负数; 只有负数:选用正数;

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100000],n;
int Sum(int k)
{
int sum=0;
sort(a+1,a+1+n);
for(int i=1;i<=k;i++)
sum+=a[n-i+1];
return sum;
}
int cmp(int b,int c)
{
if(abs(b)!=abs(c))
return abs(b)>abs(c);
else
return b>c;
}

int main()
{
int k;
while(scanf("%d %d",&n,&k)!=EOF&&n+k)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1,cmp);
int flag=0,sum=0,p=0,q=0,tot=0;
for(int i=1;i<=k;i++)
{
if(a[i]==0)
{
flag=1;
break;
}
else if(a[i]<0)
{
tot++;
q=a[i];
}
else
{
p=a[i];
}
sum+=a[i];
}

if(flag==1)
printf("%d\n",Sum(k));
else if(tot%2)
{
int x=0,y=0,te0=0;
for(int i=k+1;i<=n;i++)
{
if(a[i]>0)
{
x=a[i];
break;
}
}
for(int i=k+1;i<=n;i++)
{
if(a[i]<0)
{
y=a[i];
break;
}
}
for(int i=k+1;i<=n;i++)
{
if(a[i]==0)
{
te0=a[i];
break;
}
}
if(p==0)
{
if(x)
printf("%d\n",sum-q+x);
else
printf("%d\n",Sum(k));
}
else
{
if (x == 0 && y == 0) sum = Sum(k);
else if (x == 0) sum = sum - p + y;
else if (y == 0) sum = sum - q + x;
else if (x * p >= y * q) sum = sum - q + x;
else sum = sum - p + y;
printf("%d\n",sum);
}
}
else
printf("%d\n",sum);
}
return 0;
}

最新文章

  1. Android探索之Service全面回顾及总结
  2. Jetty官方文档翻译
  3. JAVA程序改错 (易错题)
  4. Hadoop基础教程之搭建开发环境及编写Hello World
  5. 基础之 window-self-top-opener
  6. LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ocl249.lib”
  7. Python全栈之路-Day31
  8. 渐进式Web应用(PWA)入门教程(下)
  9. 在Linux系统安装Nodejs 最简单步骤
  10. restful规范简要概述
  11. namenode format
  12. Golang入门教程(三)beego 框架安装
  13. linux内存管理源码分析 - 页框分配器
  14. 【 HDU 4936 】Rainbow Island (hash + 高斯消元)
  15. 智能优化 之 下山单纯形法 C++
  16. Spring Bean 定义继承
  17. 如何使用C++11实现C#属性概念设计
  18. Django BoundField
  19. php爬虫实践
  20. centos7下载自定义仓库的镜像设置方法

热门文章

  1. 好用的json-path
  2. 使用ContentResolver添加数据、查询数据
  3. ASP.NET MVC的Ajax.ActionLink 的HttpMethod=&quot;Get&quot; 一个重复请求的BUG
  4. asp.net 页面局部刷新
  5. NSString length的坑。
  6. 算法导论-钢条切割 C# 递归实现
  7. Chrome 开发者工具有了设备模拟器
  8. 【STL】-迭代器的用法
  9. wp8.1 Study11:APP里文件读写和使用XML和Json序列化
  10. 企业需要k2来解放孤岛危机