原题链接:小O的乘积
解题思路:
注意到数字的取值为[-10000,10000],则最小乘积应当分类讨论:
1、数据全为非负数,如 1、2、3、4、5,最小乘积为最小的两数相乘 1 * 2 = 2;(数据0也一样处理)
2、数据全为非正数,如 -5、-4、-3、-2、-1,最小乘积为最大的两数相乘 -2 * -1 = 2;(数据0也一样处理)
3、数据有正数,也有负数,如 -3、-2、-1、1、2,最小乘积为最小值与最大值乘积 -3 * 2 = -6。
综上,只要得到输入数据的最大值max1、次大值max2、最小值min1、次小值min2,再分类讨论输出结果即可。
注意事项:
max1、max2、min1、min2的初始化。
参考代码:
#include<stdio.h> int main() { int i, n, num, min1, min2, max1, max2; while (scanf("%d", &n) != EOF) { // 初始化min1、min2、max1、max2 scanf("%d%d", &min1, &min2); if (min1 > min2){ int t = min1; min1 = min2; min2 = t; } // min1成为最小值,min2为次小值 max1 = min2; // max1为最大值 max2 = min1; // max2为次大值 for (i = 2; i < n; i++) { scanf("%d", &num); if (num > max1) { // 若num大于最大值max1 max2 = max1; // max2成为次大值 max1 = num; // max1更新 } else if (num > max2) { // 若num只比max2大 max2 = num; // 直接更新max2 } else if (num < min1) { // 若num小于最小值min1 min2 = min1; // min2始终为次小 min1 = num; // min1更新,为最小 } else if (num < min2) { // 若仅比min2小 min2 = num; // 更新次小值 } } if (max1 <= 0) // 数据都为非正数 printf("%d\n", max1 * max2); // 最小乘积为最大的两个相乘 else if (min1 >= 0) // 数据都为非负数 printf("%d\n", min1 * min2); // 最小乘积为最小的两个相乘 else // 数据有负数也有正数 printf("%d\n", min1 * max1); // 最小乘积为最大的正数 * 最小负数 } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复