题目:
贝西是一头母牛。每天晚饭,如果谷仓里有干草,她会吃一个干草。农夫约翰不想让贝西挨饿,所以有时他会送一批干草,早上(晚饭前)送到。在di天,农夫约翰会发送了一批数量为bi干草包(1≤di≤10^14,1≤bi≤10^9)。
计算贝西在前T天吃的干草包总数。
INPUT FORMAT(输入来自终端/stdin):
第一行包含N和T(1≤N≤10^5,1≤T≤10^14)。
接下来的N行各包含di和bi。此外,还保证1≤d1
输出Bessie在前T天吃的干草包数量。
请注意,此问题中涉及的大整数大小可能需要使用64位整数数据类型(例如,C/C++中的“long-long”)。
样本输入:
1 5
1 2
样本输出:
2
两个干草包在第一天早上到达。贝西在第一天晚餐吃一个干草,第二天吃另一个干草。在第3…5天,贝西再也吃不到干草了。在最初的5天里,贝西总共吃了2捆干草。
样本输入:
2 5
1 2
5 10
样本输出:
3
两个干草包在第一天早上到达。贝西在第1天和第2天吃了一个干草。在第3天和第4天,贝西没有干草吃。第5天早上,10个干草包抵达。贝西在第5天晚餐时吃了一块干草。在最初的5天里,贝西总共吃了3捆干草。
样本输入:
2 5
1 10
5 10
样本输出:
5
10个干草包在第1天早上到达。贝西在第1…4天吃了一个干草。第5天早上,又有10个干草包到达,这意味着谷仓里有16个干草包。第5天的晚餐,贝西又吃了一个干草。在最初的5天里,贝西总共吃了5个干草包。
这是今天学校布置的题目,我不会,希望各位帮忙解答一下(用C++的算法进行),最希望给出代码和思路!
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N, T;
cin >> N >> T;
long long d[N], b[N],c[N],s=0,sum=0;
for (int i = 0; i < N; i++){
cin >> d[i] >> b[i];
c[i]=0;
}
long long ans = 0;
for (int i = 0; i < N; i++)
{
if(i==0){
s+=1;
sum-=1;sum+=b[i];
if(N==1)
s+=min((T-d[i]),sum);
}
else{
s+=min((d[i]-d[i-1]-1),sum);
sum+=b[i];
sum-=min((d[i]-d[i-1]-1),sum);
s+=min((T-d[i]+1),sum);
}
}
cout <<s<< endl;
return 0;
}
以下答案引用自GPT-3大模型,请合理使用:
!
以下是C++解题思路:
1、从输入中获取N和T,然后将每行输入(di,bi)存储到一个二维数组中;
2、从数组中遍历获取每个di,bi,计算出当前bi能可以满足多少天的干草需求;
3、根据每次计算出当前di剩余的需求,然后判断下一个di和下一个bi,如果小于当前的需求,则累加,否则重置需求,继续计算;
4、循环上述步骤,直到计算完毕,最终得出贝西在第T天吃的干草包总数。以下是代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, t;
cin >> n >> t;
vector<vector<long long>> grass(n);
for (int i = 0; i < n; i++) {
grass[i].resize(2);
cin >> grass[i][0] >> grass[i][1];
}
long long sum = 0;
long long need = 0;
for (int i = 0; i < n; i++) {
long long days = grass[i][0];
long long amount = grass[i][1];
if (days > t)
break;
else {
if (t - days >= need) {
sum += amount;
need -= amount;
}
else {
sum += (t - days + 1);
break;
}
}
}
cout << sum << endl;
return 0;
}
如果我的回答解决了您的问题,请采纳我的回答
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!