题目链接:https://www.luogu.org/problemnew/show/P5019
花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧。求过!
分析:
这道题我们可以采用一种略带数学&贪心的思想来解决,其实也可以使用差分,但并没有必要了。因为任何一个点都可以单独减1。
我们可以遍历每个点,然后发现当后一个点b的值大于前一个点的值时,我们需要把b减去前面的那个值(或再之前的),来实现最优解。
因为我们发现,要最短的天数就必须每天最长的修理距离,最长的修理距离也就是要保证前几天施完工后给这一天留下的最长。
然后问题差不多就解决了。
如有问题,欢迎私信讨论。
放代码
代码:
#include<cstdio>
using namespace std
;
int a
[100005];
int main()
{
int n
;
scanf("%d",&n
);
for(int i
=1;i
<=n
;i
++)
{
scanf("%d",&a
[i
]);
}
int ans
=0,tmp
=0,last
=0;
for(int i
=1;i
<=n
;i
++)
{
if(a
[i
]>a
[i
-1])
{
ans
+=tmp
-last
;
tmp
=a
[i
];
last
=a
[i
-1];
}
}
ans
+=tmp
-last
;
printf("%d",ans
);
return 0;
}
转载于:https://www.cnblogs.com/vercont/p/10210048.html
相关资源:JAVA上百实例源码以及开源项目