0907每日一练

某商店双11做活动,放出了N个特价商品,每个商品的价格为一个数字,排成一行,并制定了一条规则,相邻的特价商品只能买一个,请问,在满足这条购物规则的情况下,你购物的最大花销是多少钱

如:
输入: 4 11 13 3 1
输出: 18 (4+13+1)

答:
看到问题的时候,我首先想到的是,把这些商品价格放入一个数组,然后通过指针找到你想要的某一个值,然后把他们加到一起,再遍历整个数组,把多个求和出来的值,放入一个新的数组,对新的数组冒泡排序,最后输出的新数组的最后一个元素,就是所谓的最大花销。
在这里插入图片描述
光是这个双层循环的逻辑,就想了我好久,总是要注意规避指针指向超过数组范围越界的情况,而且注意到一个之前想当然的事儿就是“*p = arr[j+i]”,我原先写的是“*p = *(p+i)”,发现外层循环到第二次的时候,并不会用arr[2]的值作为起始值去计算,后来发现,上句只改变了指针指向的数,但是指针的地址还是在数组首元素那里,所以改成了直接对数组的操作。
包括前期为了考虑清楚什么时候跳出循环避免越界设的len,后来发现它和i的变化规律是一样的,而跳出循环的条件可以从求和规则上找,发现计算时的规律。
想明白这个求和,并正确输出之后,就开始把他们放到一个新数组arr1中进行冒泡排序,正好也对视频课的内容做个练习。
在这里插入图片描述
最后附上整个代码和效果图:

#include<iostream>

#define SIZE2 sizeof(arr) / sizeof(arr[0])
#define SIZE1 sizeof(arr) / sizeof(arr[0])/2
#define SIZE (sizeof(arr) / sizeof(arr[0])/2)+1
#define SIZE3 (sizeof(arr) / sizeof(arr[0])) - 1

using namespace std;


void test()
{
	int arr[] = {1,4,11,12,2,100,1000,10000};//4,11,13,3,1
	int arr1[SIZE] = { 0 };
	int *p = arr;
	int sum = 0;
	//int len = 0;

	for (int j = 0; j <= SIZE1;j++)//求和
	{
		sum = 0;
		for (int i = 0; i <= SIZE2;)
		{
			//cout << *p << endl;
			*p = arr[j + i];
			//cout << *p << endl;
			sum += *p;
			//cout << p << endl;
			//cout << *p << endl;
			//cout << sum << endl;
			//len + 2;
			i = i + 2;
			if ((j+i) > SIZE3)
				break;
		}
		//cout << sum << endl;
		arr1[j] = sum;                        //求得的和放入一个新数组
		//cout << arr1[j] << endl;
	}
	//冒泡排序
	for (int j = 0; j < SIZE-1; j++)
	{
		for (int i = 0; i < SIZE-1; i++)
		{
			if (arr1[i] > arr1[i + 1])
			{
				int temp = arr1[i];
				arr1[i] = arr1[i + 1];
				arr1[i + 1] = temp;
			}
		}
	}
	cout << "冒泡排序结果:" << endl;
	for (int i = 0; i < SIZE; i++)
	{
		cout << arr1[i] << "  ";
	}
	cout << "  " << endl;
	cout << "即最大花销:" << endl;
	cout << arr1[SIZE - 1] << endl;
}
int main()
{
	test();

	system("pause");
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/guo_xyx/article/details/108499240
今日推荐