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, ...
随机推荐
- 如何实现ASP.NET中网站访问量的统计
如何实现ASP.NET中网站访问量的统计 2009-07-30 15:50 佚名 网翼教程网 字号:T | T 本文介绍了如何在asp.net中进行网站访问量的统计. AD:51CTO 网+ 第十二期 ...
- ARM2440换lcd
将原来的3.5寸分辨率为240x320换为480x272所需要修改的地方 时序设置: CLKVAL=4 (VCLK =10) 5< VCLK <12 每个点扫描周期 ...
- 第46套题【STL】【贪心】【递推】【BFS 图】
已经有四套题没有写博客了.今天改的比较快,就有时间写.今天这套题是用的图片的形式,传上来不好看,就自己描述吧. 第一题:单词分类 题目大意:有n个单词(n<=10000),如果两个单词中每个字母 ...
- HDU 2594 扩展kmp模板题
题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 #include <iostream> #include <cstdio> #include ...
- Android中 服务里的方法抽取成接口
1 写个类继承Service 重写 onBind方法 返回一个IBinder 对象(传递到连接成功时用) 2 服务中 写一个内部类 继承IBinder 并且实现一个接口(用于抽取方法)继承IBinde ...
- AS的快捷键
Ctrl+Shift+Alt+N 查找类中的方法或变量 Ctrl+P 方法参数提示 Alt+Insert 生成代码(如get,set方法,构造函数等) 删除导入多余的包Ctrl+Alt+o 提取局部变 ...
- Tomcat的目录结构(二)
一.Tomcat的目录结构 bin:启动和关闭Tomcat的bat文件 conf:配置文件 server.xml:配置和server相关的信息,比如:Tomcat启动的端口号,配置Host,配置Con ...
- 《CheckboxDemo.java》
import java.awt.*; import java.applet.Applet; public class CheckboxDemo extends Applet { String Uni[ ...
- 《hanoi(汉诺塔)问题》求解
//Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...
- poj1179
//Accepted 244 KB 0 ms //区间dp //石子合并模型 #include <cstdio> #include <cstring> #include < ...