首页 > 编程语言 >c++解修剪花圃问题

c++解修剪花圃问题

时间:2024-11-08 09:19:32浏览次数:3  
标签:Xman 修剪 ++ 植物 c++ 花圃 数组

C++解“修剪花圃”

题目描述
你知道吗?在外国,如果你不修剪你的花圃,是要被贴罚单的。Xman忙于战斗,被贴了好多罚单。这一次好不容易休息了,他决定修剪一下。修剪成什么样子呢?当然是X形。
Xman的花圃是一个n*n的正方形,其中n为大于等于3的正奇数。在每个位置上都有几个植物,对应的正整数是该植物的高度h。Xman的修剪策略是,首先把不在两条对角线上的植物通通铲光,然后在对角线上找到最矮的一株植物,把剩余的其他植物都裁剪成与它等高,这样一个漂亮整齐的X型就出来了。
Xman的东西当然值钱了。每1单位高度的植物,就可以卖2美元,把减掉的植物都卖掉,就可以弥补罚单的损失了。你帮Xman计算一下一共可以卖多少钱。

输入
有多行。第一行是一个整数n(n<1000),表示花圃的边长。
接下来n行是一个n*n的正整数二维数组,每个正整数值表示对应植物的高度h(h<1000)。

输出
卖出的美元总数。

样例输入
3
1 1 3
3 2 2
1 2 2
样例输出
24

关于本题的解法可以通过数组来进行求解:

for (i = 0; i < n; i++)//n是第一行输入的数据。
	for (j = 0; j < n; j++)
		cin >> a[i][j];//通过两次循环来给数组以此赋值。

那么如何来进行花圃的判断呢?
已知花圃修剪时呈“X”型,所以在此位置的行列关系分析可得:

(i == j) || (i + j == n - 1)

通过以上两点即可进行判断。

故本题解法如下所示:

#include<iostream>
using namespace std;
int a[1000][1000], n, i, j, m, s;//将数组a放在全局变量里面定义,否则会出现自动结束的情况。
int main()
{
	s = 0;  
	m = 1000;//m存在的意义为找出数组中的最小值,故在初始时将其赋值范围中的最大值参与后续的判断。
	cin >> n;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			cin >> a[i][j];
			if ((i == j) || (i + j == n - 1))
			{
				if (a[i][j] < m)
					m = a[i][j];//m为数组中的最小值
			}
			else
			{
				s = s + a[i][j];//全部剪去
			}

		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if ((i == j) || (i + j == n - 1))
				s = s + (a[i][j] - m);
		}
	}
	cout << s * 2;
	return 0;
}

本题的难点在于全局变量的考虑以及修剪出特殊形状时 i 、j 之间关系的判断。

以上,希望对您的解题有所帮助。

标签:Xman,修剪,++,植物,c++,花圃,数组
From: https://blog.csdn.net/2403_86857331/article/details/143596700

相关文章

  • C++总结
    目录一、面向对象的三大特性二、引用2.1概念2.2特性三、类与对象3.1概念3.2类的内容3.3对象的创建四、构造函数与析构函数五、封装六、继承6.1概念与基础使用6.2继承权限6.2.1权限修饰符6.2.2继承权限6.3构造函数6.3.1派生类与基类的构造函数关系6.3......
  • 【C++11】智能指针
    一.为什么需要智能指针        学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压......
  • 【C++】C++11之函数对象,Lambda表达式和functional函数对象类型
    知识的学习在于点滴记录,坚持不懈函数对象        重载了函数调用运算符()的类的对象,即为函数对象。        std::function由上文可以看出:由于可调用对象的定义方式比较多,但是函数的调用方式较为类似,因此需要使用一个统一的方式保存可调用对象或者传递可......
  • C++循环引用指的是什么,在使用过程当中需要注意什么问题
    C++中的循环引用是指两个或多个对象相互持有对方的引用,导致这些对象无法被自动释放,从而造成内存泄漏。循环引用主要发生在使用智能指针(如 std::shared_ptr)管理对象生命周期时。以下是循环引用的具体解释及其使用中需要注意的问题:循环引用的形成当两个对象A和B互相持......
  • C++ 委托实现
    MyDelegate.h#pragmaonce#include<typeinfo.h>#include<list>#include<vector>namespaceDelegate{ //IDelegate提供接口的基类 template<typenameReturnType,typename...ParamType> classIDelegate { public: IDelegate(){} ......
  • C++之map容器
    map是C++STL(StandardTemplateLibrary)中的一种关联容器,用于存储键值对(key-valuepairs)。每个键(key)在map中都是唯一的,并且键值对会根据键的值进行排序(默认为升序)。map的内部实现通常为红黑树,因此它提供了高效的插入、删除和查找操作。主要特点键的唯一性:每个键在 ......
  • C++之stack容器
    stack是C++STL(StandardTemplateLibrary)中的一种容器适配器,用于实现后进先出(LIFO,LastInFirstOut)的数据结构。stack提供了一组基本的操作来管理栈顶元素的插入和移除。stack的底层可以基于不同的容器(如vector、deque或list)实现,默认情况下使用deque。主要特......
  • C++之queue容器
    queue是C++STL(StandardTemplateLibrary)中的一种容器适配器,用于实现先进先出(FIFO,FirstInFirstOut)的数据结构。queue提供了一组基本的操作来管理队列前端和后端的元素。queue的底层可以基于不同的容器(如deque或list)实现,默认情况下使用deque。主要特点先进......
  • c++11 --- 左值与右值的使用;
    C++98的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,C++11之后我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名(语法层面上)。左值和右值左值是一个表示数据的表达式(如变量名或解引用的指针),一般是有持久状态,存储在内存中,我们......
  • 【C++】封装红黑树实现mymap和myset
     无论你觉得自己多么的了不起,也永远有人比你更强。......