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;
    }

  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/tsw123/p/4339834.html
Copyright © 2011-2022 走看看