P5019铺设道路 从贪心模拟到递推 大量注释,通俗易懂

题目及链接

题目链接:https://www.luogu.com.cn/problem/P5019
在这里插入图片描述

解题思路一:模拟+贪心(部分超时)

实现思路

1.从左开始往右填土,填到已经填完的位置(即该地区深度位0)或者填到最末尾的位置,则结束当天的填土任务,天数自增1
2.当左侧已经完成填土(即该地区深度位0),则修改填土开始的位置(减少循坏次数)
3.看看最后一个位置还有多少深度没填,有多少个深度没填则增加多少天

具体代码

public class P5019铺设道路2 {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		int n=Integer.valueOf(in.readLine());
		int[] data=new int[n];//题干输入的数据
		String[] strs=in.readLine().split(" "); 
		for (int i = 0; i < strs.length; i++) {
			data[i]=Integer.valueOf(strs[i]);
		}
		
		int left=0;//已经填完的最右边的下标
		int day=0;//需要多少天填完
		while (left<data.length-1) {
			for (int i = left; i < data.length; i++) {
				//更新左边已经填完的位置
				while (left<data.length && data[left]<=0) left++;
				
				if(data[i]<=0) {//填到的地方已经填完,天数自增一,结束该天的循环
					day++;
					break;
				}
				data[i]--;//填过的区域下陷深度减一
				//填到最后位置,天数自增一
				if(i==data.length-1) day++;
			}
		}
		day+=data[n-1];//最后一个位置还有多少深度没填
		System.out.println(day);
		in.close();
	}
}

执行结果:有两条数据超时

解题思路二:递推

实现思路

递推公式:

f[i]=f[i−1]+(a[i]−a[i−1])。

说明:
当前部分深度<前一部分深度,总步数不变
当前部分深度>前一部分深度,总步数=总步数+当前部分深度-前一部分深度

具体代码

public class P5019铺设道路3 {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		int n=Integer.valueOf(in.readLine());
		int[] data=new int[n];//输入数据
		String[] strs=in.readLine().split(" "); 
		for (int i = 0; i < strs.length; i++) {
			data[i]=Integer.valueOf(strs[i]);
		}
		
		int day=data[0];
		//根据递推公式求解
		for (int i = 1; i < data.length; i++) {
			if(data[i]>data[i-1]) {
				day+=(data[i]-data[i-1]);
			}
		}
		
		System.out.println(day);
		in.close();
	}
}

执行结果:时间:689ms 空间:29.56MB
相似题目:P1969 [NOIP2013 提高组] 积木大赛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值