题解CF45I【TCMCF+++】

题目大意:给你$N$个整数,让你从中选$r$个数($0<r \leq N$),使得它们的乘积最大。输出任意一组解

思路:(大佬勿喷

  • 1 我们知道几个正整数的乘积总是正数,所以遇到正整数直接输出就好啦

  • 2 遇到负数就不同了,我们知道“奇负偶正”,于是就有两种情况:

    • 1 如果有偶数个负数,因为“偶正”,所以全部输出

    • 2 如果有奇数个负数,我们只能输出个数-1个负数,并且这些负数的绝对值最大

  • 3 接下来还需要三个特判

    • 特判1:如果$N=1$并且这个数小于等于0,输出这个数

    • 特判2:如果$N$($N>1$)个整数全是0,输出0

    • 特判3:如果$N$($N>1$)个整数中全是非正数(只有0和负数),如果只有1个负数并且0的个数不为0,输出0(因为0比负数大)

  • 4 然后。。。你就AC

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
using namespace std;
int n,a[110],sum1=0,sum2=0;//sum1统计0的个数,sum2统计负数的个数
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
if(a[i]<0) sum2++;//a[i]是负数,sum2++
else
if(a[i]==0) sum1++;//a[i]是0,sum1++
else
printf("%d ",a[i]);//a[i]是正数,输出!
}
sort(a+1,a+n+1);//因为要取绝对值最大的负数,所以先排序
if(sum2%2==0)//偶数个负数全部输出
{
for(int i=1; i<=sum2; i++)
{
printf("%d ",a[i]);
}
}
else//奇数个负数输出个数-1个
{
for(int i=1;i<=sum2-1;i++)
{
printf("%d ",a[i]);
}
}
if(n==1&&a[1]<=0)
{
cout<<a[1];
return 0;
}
if(sum1==n) cout<<0;//全是0
if(sum1+sum2==n&&sum2==1) cout<<0;//全是负数和0且负数只有一个
return 0;
}