C++算法题(不超过普及组难度)

题目:
贝西是一头母牛。每天晚饭,如果谷仓里有干草,她会吃一个干草。农夫约翰不想让贝西挨饿,所以有时他会送一批干草,早上(晚饭前)送到。在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≤d1OUTPUT FORMAT(输出格式)(将输出打印到终端/标准输出):
输出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;
}

如果我的回答解决了您的问题,请采纳我的回答

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632