codeforces round106 C

题意:

给定的n,从方格(0,0)走到(n,n)。其中需要拐弯k次,规定k<n-1。现给出k次拐弯的单位花费,问从(0,0)到(n,n)最小的花费是多少

思路:

(0,0)在右下角,(n,n)在左上角。从(0,0)到(n,n)只能向右或向上走。那么不妨设第一次向右走,那么向右走的线段都对应了单位花费中的奇数项,向上走的线段都对应了偶数项。对于向右走的线段,遍历所有奇数项,找出最小单位花费,使得其他花费都只走一个单位,剩下的路程交由最小单位花费完成,这是向右走的最小花费。同理求出向上走的最小花费。加起来就是总的最小花费。
但完全k次拐弯后得到的最小花费不一定是最小花费,因为拐弯次数的增加会有新的单位花费,这可能会导致最小花费的增加。因此遍历k次拐弯的最小花费,每次都求出最小花费,最小值则是真正的最小花费。

核心代码:

int right, up;//向右和向上走过的花费
int minright,minup;//存放当前向右向上的最小单位花费
int ans;
right = c[1];
up = c[2];
minright = right;
minup = up;
for (int i = 3;i < n;i++){
	if (i&1){
		right += c[i];
		minright = min(minright, c[i]);
	}else{
		up += c[i];
		minup = min(minup, c[i]);
	}
	ans = min(ans, right + up + minright * (n - (i + 1) / 2) + minup * (n - i / 2));//这里向右向上走的步数可以通过i直接计算(因为在循环结尾计算ans,所以这里已经将right,up中多算的一次minright和minup减去了)
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值