AcWing 4908. 饥饿的牛
4908. 饥饿的牛 - AcWing题库
贝茜是一头饥饿的牛。
每天晚上,如果牛棚中还有干草的话,贝茜都会吃掉其中的一捆。
初始时,牛棚中没有干草。
为了让贝茜不被饿死,农夫约翰制定了$N$个给贝茜送干草的计划。
其中第$i$个计划是在第$d_i$天的白天给贝茜送去$b_i$捆干草。
这些计划互不冲突,保证$1 \le d_1 < d_2 < \cdots < d_N \le T$。
请你计算,贝茜在第$1 \sim T$天中有多少天有干草吃。
输入格式
第一行包含两个整数$N$和$T$。
接下来$N$行,每行包含两个整数$d_i, b_i$。
输出格式
输出贝茜在第$1 \sim T$天中有干草吃的天数。
数据范围
输入样例1:
输出样例1:
样例1解释:
两捆干草在第$1$天早上被送到了牛棚,所以贝茜第$1, 2$天有干草吃。
输入样例2:
输出样例2:
样例2解释:
两捆干草在第$1$天早上被送到了牛棚,所以贝茜第$1, 2$天有干草吃。
$10$捆干草在第$5$天早上被送到了牛棚,所以贝茜第$5$天有干草吃。
输入样例3:
输出样例3:
样例3解释:
$10$捆干草在第$1$天早上被送到了牛棚,所以贝茜第$1 \sim 5$天都有干草吃。
题解
我的题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| #include <iostream> using namespace std;
const int N = 100010; long long n, T; long long d[N], b[N];
int main() { cin >> n >> T; for (long long i = 0; i < n; i ++) cin >> d[i] >> b[i]; d[n] = T; b[n] = 0;
long long sum = 0; long long res = 0; for (long long i = 0; i < n; i ++) { long long curr = i; long long next = i + 1; sum += b[curr]; if (sum >= d[next] - d[curr]) { res += d[next] - d[curr]; sum -= d[next] - d[curr]; } else { res += sum; sum = 0; } } if (sum) { res ++; } cout << res << endl; return 0; }
|
y总题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> #include <cstring> #include <algorithm>
using namespace std;
typedef long long LL;
int main() { int n; LL T;
scanf("%d%lld", &n, &T);
LL res = 0, cur = 0, last = 0; for (int i = 1; i <= n; i ++ ) { LL d, b; scanf("%lld%lld", &d, &b); LL len = d - 1 - last; LL days = min(len, cur);
res += days; cur = cur - days + b; last = d - 1; }
res += min(cur, T - last); printf("%lld\n", res); return 0; }
|