度度熊回家问题

这个题目说实话我自己看了半个小时没看懂,后来请教了同学,然后他给的解释及题目如图所示

好吧,看了人家给的解释,自己在本地编辑运性了大概半个小时,终于写出来啦,没有用什么特殊的算法,最蠢的办法来的。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int n;
	cin>>n;
	int arr[n];
	int tmp=0;
	int store=0;
	for(int i=0;i<n;i++)
		cin>>arr[i];
	//这个向量用来存储忽略N-2个点中其中一个后,每种方法需要走的步数
	//最后再给这个向量进行排序,从小到大,然后返回res[0]就ok了
	//这里面主要就是依次忽略下标从1-N-2的数
	//我的方法是,两层循环
	//外循环,代表依次忽略arr[1],arr[2],.....arr[N-2]
	//内层循环就是从下标0-N-1,但是,这里我要注意两种情况
	//由于我计算步数的方法是,相邻两个点之差的绝对值,这种方法很简单
	//但是要跳过某一个数,我的方法是在内层循环用了两个if语句
	//这两个if语句表示,如果当前点比要忽略的点差1,则,直接求解abs(arr[j+2]-arr[j])
	//但是如果下一次循环,刚好我的当前点就是要忽略的那个点,那直接没有任何操作,continue即可
	//这里我每次外循环执行一次后都给tmp置为0,因为他是来临时存储每忽略一个数,所需要的步数,在将他放入结果数组后,就可以置0
	vector<int> res;
	for(int i=1;i<n-1;i++)
	{
		tmp=0;
		for(int j=0;j<n-1;j++)
		{

			if(i==j+1)
			{
				tmp+=abs(arr[j+2]-arr[j]);
				//cout<<"abs(arr["<<j+2<<"]-arr["<<j<<"])="<<tmp<<endl;
				continue;
			}
			if(i==j)
			{
				
				continue;
			}
			tmp+=abs(arr[j]-arr[j+1]);
			//cout<<"abs(arr["<<j<<"]-arr["<<j+1<<"])="<<tmp<<endl;
			//cout<<tmp<<endl;
		}
		res.push_back(tmp);
	}
	/*
	for(int i=0; i<res.size();i++)
		cout<<res[i]<<endl;
		*/
	for(int i=1; i<=res.size()-1;i++)
	{
		for(int j=0;j<res.size()-i;j++)
		{
			if(res[j]>res[j+1])
			{
				int t=res[j];
				res[j]=res[j+1];
				res[j+1]=t;
			}
		}
	}
	/*
	for(int i=0; i<res.size();i++)
		cout<<res[i]<<endl;
		*/
	cout<<res[0]<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值