【题解】CF45I TCMCF+++
2024-10-20 11:25:48
题面传送门
题目描述
有 \(n\) 个数 \(a_i\) 请你从中至少选出一个数,使它们的乘积最大
解决思路
对于正数,对答案一定有贡献(正数越乘越大),所以输入正数时直接输出即可。
对于负数,如果负数的个数 \(f\) 是偶数,负负得正,可以全部输出。如果负数的个数 \(f\) 为奇数,那么就输出绝对值较大的 \(f-1\) 个。
有一种特殊情况,那就是 \(n = 1\) ,且唯一的数是负数,那就直接输出这个负数。
对于 \(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;
}
望过
最新文章
- [转载:]Fortran 二进制文件读写
- 微软BI 之SSRS 系列 - 如何设置页标题重复
- WordPress添加固定位置的百度分享按钮
- DS实验题 Old_Driver UnionFindSet结构
- Linux系统文件的隐藏属性
- 【Tech】YCSB-0.1.3安装使用
- 转:Android官方MVP架构示例项目解析
- Classes and Objects :类和对象(2)
- oracle函数、包、变量的定义和使用、重点”结构体和数组”
- Class File Editor: Source not found
- 给Visual Studio更替皮肤和背景图
- js 触摸事件
- foreach 循环的应用传值
- (转载)一个生动的NIO描述
- CentOS7配置更新国内yum源
- springboot-项目获取resources下文件碰到的问题(classPath下找不到文件和文件名乱码)
- bug总结
- cf869C组合计数问题
- django静态文件路径配置
- 关于pom版本提交不成功的问题