题目及链接
题目链接: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 提高组] 积木大赛