原题链接Problem - 1921C - Codeforces
#include<iostream>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int N = 2e5 + 10;
ll m[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n, f, a, b,tg=0;
cin >> n >> f >> a >> b;
rep(i, 1, n) cin >> m[i];
m[0] = 0;
rep(i, 1, n) {
if ((m[i] - m[i - 1]) * a < b)
f -= (m[i] - m[i - 1]) * a;
else f -= b;
if (f <= 0) {
cout << "NO\n";
tg = 1;
break;
}
}
if (!tg) cout << "YES\n";
}
return 0;
}
通过比较每两个时间点保持开机还是先关机再开机哪个耗电少,就用剩余电量f减去耗电少的选择,f小于等于0时即可判断无法发送完所有消息,遍历所有时间点结束后若f仍大于0说明能够全部发送完成
这题不难,但是第一次做这道题第二个测试点就错了,可能是题意没有理解清楚,b是关机一次再开机一次花费的电量,而不是开关机分别所需的电量