【题解】CF45I TCMCF+++

题面传送门

题目描述

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

解决思路

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

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

  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 @   Binary_Lee  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 欧阳的2024年终总结,迷茫,重生与失业
· Bolt.new 30秒做了一个网站,还能自动部署,难道要吊打 Cursor?
· 史上最全的Cursor IDE教程
· 关于产品设计的思考
· 我的编程之路 2024
Title
点击右上角即可分享
微信分享提示