【题解】CF45I TCMCF+++

题面传送门

题目描述

\(n\) 个数 \(a_i\) 请你从中至少选出一个数,使它们的乘积最大

解决思路

  1. 对于正数,对答案一定有贡献(正数越乘越大),所以输入正数时直接输出即可。

  2. 对于负数,如果负数的个数 \(f\) 是偶数,负负得正,可以全部输出。如果负数的个数 \(f\) 为奇数,那么就输出绝对值较大的 \(f-1\) 个。

  3. 有一种特殊情况,那就是 \(n = 1\) ,且唯一的数是负数,那就直接输出这个负数。

  4. 对于 \(0\) 也要特殊讨论。如果全部是 \(0\) 或者除 \(0\) 外只有一个负数,那么只能输出 \(0\)

代码十分简短。

感觉思路和其他大佬都很像

AC code

#include<bits/stdc++.h>
using namespace std;
int n,a,f,l,ans[105],t; //ans数组存储负数,f为负数个数,l为零的个数 
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    	scanf("%d",&a);
    	if(a>0) printf("%d ",a); //如果是正数就直接输出 
    	else a==0?l++:ans[++f]=a; //三目运算,如果是零l++,否则存到负数数组里 
	}
	if(f==1&&n==1) printf("%d",ans[1]); //只有一个负数 
	else if(l==n||(f==1&&l==n-1)) printf("0"); //0的特殊情况 
	else{
		sort(ans+1,ans+f+1); //对负数排序 
		if(f%2==0) for(int i=1;i<=f;i++) printf("%d ",ans[i]); //偶数个就全部输出 
		else for(int i=1;i<f;i++) printf("%d ",ans[i]); //奇数个就输出绝对值大的f-1个 
	}
    return 0;
}

望过

posted @ 2022-09-29 08:16  Binary_Lee  阅读(39)  评论(0)    收藏  举报
Title