P1589 泥泞路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
- step 1:将泥泞小路针对起点排序。使用一个 结构体+自带
sort
就可以实现。 - step 2:得到起点有序的小路之外,就需要考虑怎么铺路了。该怎么铺呢?主要就是两种情况: 情况1:每次恰好只铺了自己的路。而且也刚刚好铺完,这样就不会导致与后面的铺路重复。比如“1 3”起点是1,终点是3,这样用一个长度为3的木板,一次就可以铺好。同理,“1 6”就只需要完整的2块木板。
- 情况2:世界不可能如此完美,那么遇到不能整铺的情况怎么办?例如:“1 4”用长度为3的模板就需要两块。(1-3用一块,3-4再用一块。但是很显然,3-4这块木板是多余了2米。)我们就需要考虑如何最优化这种铺法多余的木板。很简单,贪就是了!如果当前铺的终点的比下次要铺的起点要远,那么我们就用这次的终点接着铺,而不是从下次的起点开始铺。无论如何,这样都能保证铺路木板最少化(因为更短的路需要更少的木板。)例如,有两段路都需要铺,分别是“3-7,8-12”(使用长度为3的木板),可以看到(3-6-9-12)只需要3块木板,如果是分开铺(3-6-7,8-11-12),则需要4块木板
#include<iostream> #include<algorithm> #include<math.h> using namespace std; int n,l,s[10005],e[10005],i,h,d; int main() { cin>>n>>l; for(i=1;i<=n;i++) cin>>s[i]>>e[i]; sort(s+1,s+1+n); sort(e+1,e+1+n); d=s[1]; for(i=1;i<=n;i++) { while(d<e[i]) { d+=l; h++; } d=max(d,s[i+1]);//比较当前终点和下一个起点,选大的,避免重复,执行情况2; } cout<<h; return 0; }