1433:勤劳的园丁
描述
有一条长度为m米的马路,路中央是种植植物的隔离带(长度也是m米)。有一个勤劳的园丁,花了d天时间为隔离带的土地施肥,每天施肥一次。由于园丁用于携带肥料的车辆承载能力有限,只能为某一小片连续的土地施肥。而且园丁从小就不认真学政治课,导致记性有点差,每天施肥都是很随意地选择一片连续的土地。给隔离带的土地以1米的长度划分为一格基本单位,为这块m米长的土地分别编号为1、2、3、…、m。第i天施肥时,选择编号从ai到bi的土地进行施肥(包含ai和bi)。
假设还未开始施肥的时候,每块土地的肥沃度都是0。当某块土地在某天被施肥后,该块土地的肥沃度会加1。问进行了d天的施肥后,肥沃度至少为c的土地有多少米?
输入
多组案例。一个正整数n,表示案例的数量。
每组案例先是三个正整数m、c、d,然后是d行数据,每行数据有两个整数ai和bi。
(n<=20,m<=1000000,c<=d<=1000000,1<=ai<=bi<=m)
输出
针对每组案例,输出一个整数,表示肥沃度大于等于c的土地有多少米。
每组案例输出完都要换行。
样例输入
1
10 2 3
2 5
3 7
1 9
样例输出
6
HINT
第2、3、4、5、6、7米处的肥沃度都大于等于c
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
int m, c, d, a, b;
int diff[1000005] = { 0 };
//差分数组,diff[i]表示第i米的肥沃度减少
cin >> m >> c >> d;
for (int i = 0; i < d; i++)
{
//第i天施肥时,选择编号从ai到bi的土地进行施肥
scanf("%d %d", &a, &b);
//cin >> a >> b; cin所需时间比scanf多
diff[a]++;
diff[b + 1]--;
}
int cnt = 0, x = 0;//x为肥沃度
for (int i = 1; i <= m; i++)
{
x = x + diff[i];
if (x >= c)
{
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}
//f[0] f[1] f[2] f[3] f[4] f[5]
// 0 1 2 3 2 1
//第一天2~4块
//第二天3~5块
//第三天1~3块
//第四天2~900000块 g[2]++ g[900001]--
//g[0] g[1] g[2] g[3] g[4] g[5] g[6]
// 0 1 1 1 -1 -1 -1
//g[i]=f[i]-f[i-1]
//f[0] f[1] f[2] f[3] f[4] f[5]
// 0 1 2 3 4 5
//f[i]=g[0]+g[1]+...g[i]=f[i-1]+g[i]
这篇博客介绍了一种利用差分数组解决园丁在隔离带上施肥问题的算法。给定马路长度、期望肥沃度和施肥天数,通过记录每天施肥范围并在结束后计算肥沃度大于等于期望值的区域长度。输入输出示例和代码实现均被详细说明,展示了如何高效地处理这类问题。
1100

被折叠的 条评论
为什么被折叠?



