梦一场乀


私信TA

用户名:ADream

访问量:37698

签 名:

梦开始的地方。

等  级
排  名 59
经  验 11051
参赛次数 2
文章发表 35
年  龄 21
在职情况 学生
学  校
专  业 软件工程

  自我简介:



解题思路:
    

        注意到数字的取值为[-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分

1 人评分

  评论区

  • «
  • »