zoukankan      html  css  js  c++  java
  • UVa 10747

    题目大意:给出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 ",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 ",sum-q+x);
    else
    printf("%d ",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 ",sum);
    }
    }
    else
    printf("%d ",sum);
    }
    return 0;
    }

  • 相关阅读:
    jQuery.validationEngine前端验证
    Ztree异步树加载
    asp.net后台编写 loading效果
    [ASP.NET] 使用Loading遮罩防止使用者重複點擊
    Easy UI 遮罩(MASK)
    jQueryEasyUI Messager基本使用
    jquery easyui datagrid使用参考
    asp.net mvc 2.o 中使用JQuery.uploadify
    ie9,10 uploadify cleanUp bug
    SQL Server 2005 镜像构建手册
  • 原文地址:https://www.cnblogs.com/tsw123/p/4339834.html
Copyright © 2011-2022 走看看