[USACO23FEB] Watching Mooloo B
哈嗨嗨 ,今年USACO铜级没过的出来吧,好好看看这个月的题是怎么没过的吧!
题目描述
贝茜喜欢看 Mooloo 的演出。因为她是一只忙碌的奶牛,她计划在接下来的 N ( 1 ≤ N ≤ 1 0 5 ) N (1 \le N \le 10^5) N(1≤N≤105) 天去看演出。因为 Mooloo 提供了订阅服务,她想要使她花费的钱最少。
Mooloo 有一个有趣的订阅服务系统:若要在此之后的连续 d d d 天看演出,则在订阅时需要花费 d + K ( 1 ≤ K ≤ 1 0 9 ) d+K(1 \le K \le 10^9) d+K(1≤K≤109) 个单位价格。你可以随时订阅;若本次订阅已经过期,你可以根据需要订阅多次。基于以上条件,请计算出贝茜最少要花费多少个单位价格,才能完成她的计划。
输入格式
第一行输入两个正整数 N N N 和 K K K。
第二行输入 N N N 个正整数,表示在这些天里,贝茜会看 Mooloo 的演出: 1 ≤ d 1 < d 2 < ⋯ < d N ≤ 1 0 14 1 \le d_1<d_2<\cdots<d_N \le 10^{14} 1≤d1<d2<⋯<dN≤1014。
输出格式
请注意,此问题中可能需要使用 64 位整数数据类型(如 C 或 C++ 中的 long long)。
样例 #1 解释
贝茜在第 7 7 7 天时,购买了 3 3 3 天的订阅,共花费 d + K = 3 + 4 = 7 d+K=3+4=7 d+K=3+4=7 个单位价格。
样例 #2 解释
贝茜在第 1 1 1 天时,购买了 1 1 1 天的订阅,花费 d + K = 1 + 3 = 4 d+K=1+3=4 d+K=1+3=4 个单位价格;在第 10 10 10 天时,也购买了 1 1 1 天的订阅,花费 d + K = 1 + 3 = 4 d+K=1+3=4 d+K=1+3=4 个单位价格。贝茜一共花费了 8 8 8 个单位价格。
样例 #1
样例输入 #1
2 4
7 9
样例输出 #1
7
样例 #2
样例输入 #2
2 3
1 10
样例输出 #2
8
C++代码如下:
#include <iostream>
using namespace std;
long long N, K, ans;
long long days[1000005];
int main() {
cin >> N >> K;
for (int i = 0; i < N; i++){
cin >> days[i];
if (i == 0){ //如果是第一天
ans += K + 1; //开始一个订阅
}
else{ //如果不是
long long extandcost = days[i] - days[i-1];
long long startcost = K + 1;
ans += min(extandcost, startcost);//比较续约和重新开始一个订阅(取最便宜的)
}
}
cout << ans;
return 0;
//优雅结束
}