补题Educational Codeforces Round 85 (Rated for Div. 2)
Posted streamazure
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补题Educational Codeforces Round 85 (Rated for Div. 2)相关的知识,希望对你有一定的参考价值。
C题直接贪心,D题欧拉回路,理论上应该会做的……
然后应该读题比较慢的关系,A题+B题各做了20分钟……还是15分钟内连切两道比较理想,毕竟挂了梯子,开CF的速度也不慢。
(n)只怪物站成一圈,第(i)只怪物有(a[i])点生命值和(b[i])点爆炸伤害。当第(i)只怪物死亡时会爆炸,且只对第(i+1)只怪物造成(b[i])点伤害。爆炸可以传递。每次开枪会对其中一只怪物造成(1)点伤害,求能杀死全部怪物的最小开枪次数。
这题的数据范围有点emmm,我还以为要想办法写(O(1))来着,其实是(O(n))。
对每只怪物视为首个击杀目标,计算要补枪的次数(就是其它怪物扣除爆炸伤害后的剩余血量)遍历n只就好,用set维护最小值(感觉get到了什么新用法……)。
注意(n==1)时特判一下。
#include<iostream>
#include<map>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<set>
using namespace std;
const int N = 1e5 + 5;
int main()
{
int q;
cin >> q;
while (q--) {
int n;
cin >> n;
long long int arr[N], pow[N], shrey[N];
set<long long int> s;
cin >> arr[0] >> pow[0];
if (n == 1) {//只有一只怪物,特判
cout << arr[0] << endl;
continue;
}
long long int sum = 0;//不会被直接炸死的怪物的剩余血量
for (int i = 1;i < n;i++) {
cin >> arr[i] >> pow[i];
shrey[i] = arr[i] - pow[i - 1];//shrey[i]是第i只怪物被炸后的剩余血量
if (shrey[i] > 0) {//不会被直接炸死
sum += shrey[i];//剩余血量
}
}
shrey[0] = arr[0] - pow[n - 1];
if (shrey[0] > 0) sum += shrey[0];
for (int i = 0;i < n;i++) {
if (shrey[i] > 0) {
s.insert(sum - shrey[i] + arr[i]);
//总残余血量-这只怪物残余血量+这只怪物生命值
//即将它视为首个目标时需要的子弹数量
}
else {
s.insert(sum + arr[i]);//总残余血量-(0)+生命值
}
}
cout << *s.begin() << endl;//输出最小值
}
return 0;
}
以上是关于补题Educational Codeforces Round 85 (Rated for Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 78 (Rated for Div. 2) --补题
Educational Codeforces Round 74 (Rated for Div. 2)补题
Educational Codeforces Round 24 CF 818 A-G 补题
Educational Codeforces Round 48 (Rated for Div. 2) - 赛后补题