UVa 10747 - Maximum Subsequence
题目大意:给出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;
}
UVa 10747 - Maximum Subsequence的更多相关文章
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- 1007. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- PAT - 测试 01-复杂度2 Maximum Subsequence Sum (25分)
1, N2N_2N2, ..., NKN_KNK }. A continuous subsequence is defined to be { NiN_iNi, Ni+1N_{i ...
- Maximum Subsequence Sum(接上篇)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- PAT 解题报告 1007. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
- 最大子列和CT 01-复杂度2 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- 连续子数组的最大和/1007. Maximum Subsequence Sum (25)
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- Algorithm for Maximum Subsequence Sum z
MSS(Array[],N)//Where N is the number of elements in array { sum=; //current sum max-sum=;//Maximum ...
- 数据结构练习 01-复杂度2. Maximum Subsequence Sum (25)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...
随机推荐
- 使用SMSManager短信管理器发送短信
import android.os.Bundle;import android.app.Activity;import android.app.PendingIntent;import android ...
- HDU 3265 扫描线(矩形面积并变形)
Posters Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 启动项目报错Error: listen EADDRINUSE
我在使用elasticsearch的kibana插件时候,有一次启动,遇到这个错误: Error: listen EADDRINUSE 它的意思是,端口5601被其他进程占用. 故而,需要kill掉那 ...
- Exif的Orientation信息说明
EXIF Orientation 参数让你随便照像但都可以看到正确方向的照片而无需手动旋转(前提要图片浏览器支持,Windows 自带的不支持) 这个参数在佳能.尼康相机照的照片是自带的,但我的奥林巴 ...
- mysql 远程连接
4.现在如果用你电脑上的终端进行MySQL连接时,有可能出现如下错误: MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXX ...
- 戴文的Linux内核专题:05配置内核(1)
转自Linux中国 现在我们已经了解了内核,现在我们可以进入主要工作:配置并编译内核代码.配置内核代码并不会花费太长时间.配置工具会询问许多问题并且允许开发者配置内核的每个方面.如果你有不确定的问题或 ...
- C++中各种容器的类型与特点
1.vector 连续存储结构,每个元素在内存上是连续的: 支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下: 2.deque 连续存储结构,即其每个元素在内存上也是连续的 ...
- CPU是怎么制造的
大概的过程就是,先选一堆好沙子(纯净的沙子),初步加工一般在沿海,然而都是初加工,因为技术不行,所以一般用比较污染环境的方法加工大99.9%纯度的硅,然后低价卖给国外企业,用高精尖技术加工到99.99 ...
- 创建dialog
创建一个dialog有一下两种方式: 1.Data属性:DOM添加属性data-toggle="dialog"后,单机触发. a链接打开: <a href="jso ...
- IOS文件管理-NSFileMangager-NSdata
Ios下的文件管理, Ios下不像windows 文件系统那样可以访问任何的文件目录,如C盘.D盘什么的.在Ios中每个应用程序只能访问当前程序的目录,也即sandbox(沙盒模型). iOS为每个应 ...