Acwing4908. 饥饿的牛

贝茜是一头饥饿的牛。

每天晚上,如果牛棚中还有干草的话,贝茜都会吃掉其中的一捆。

初始时,牛棚中没有干草。

为了让贝茜不被饿死,农夫约翰制定了 N 个给贝茜送干草的计划。

其中第 i 个计划是在第 di 天的白天给贝茜送去 bi 捆干草。

这些计划互不冲突,保证 1≤d1

请你计算,贝茜在第 1∼T 天中有多少天有干草吃。

输入格式

第一行包含两个整数 N 和 T。

接下来 N 行,每行包含两个整数 di,bi。

输出格式

输出贝茜在第 1∼T 天中有干草吃的天数。

数据范围

1≤N≤10^5,
1≤T≤10^14,
1≤di≤10^14,
1≤bi≤10^9。

输入样例1:

1 5
1 2

输出样例1:

2

样例1解释

两捆干草在第 1 天早上被送到了牛棚,所以贝茜第 1,2 天有干草吃。

输入样例2:

2 5
1 2
5 10

输出样例2:

3

样例2解释

两捆干草在第 1 天早上被送到了牛棚,所以贝茜第 1,2 天有干草吃。

10 捆干草在第 5 天早上被送到了牛棚,所以贝茜第 5 天有干草吃。

输入样例3:

2 5
1 10
5 10

输出样例3:

5

10 捆干草在第 1 天早上被送到了牛棚,所以贝茜第 1∼5 天都有干草吃。

#include 
#include 
#include 

using namespace std;

typedef long long LL;
LL n, t, d, b; // 简单的提示:分别对应题目中的四个变量
int main()
{
    LL s = 0, u = 0;// s是用来计数 , u是用来记录上一次供草能维持到哪一天
    cin >> n >> t;
    while(n--){
        cin >> d >> b;

        //如果u比d大,那么说明d这一天,甚至往后的几天已经有草了,就将d更新到u之后最近没草的那一天
        if(u >= d)
            d = u + 1;

        //将u更新为d之后有草的最后一天
        u = d + b - 1;

        //记录有多少天有草
        s += b;

        //d之后有草的最后一天在规定的时间之后,那就将多余的部分减去
        if(u >= t){
            s -= u - t;

            //因为已经到达规定的天数了,那么退出循环就行,后边的不需要再计算了
            break;
        }
    }

    //输出一下s就行
    cout << s << endl;
}

本题目巧妙在不需要开数组进行计算 

 

你可能感兴趣的:(算法基础课,算法,算法,c++,枚举)