二分疫苗小孩
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分疫苗小孩相关的知识,希望对你有一定的参考价值。
题目链接:
https://ac.nowcoder.com/acm/contest/23480/A
打疫苗可以提升手速,但是打疫苗有限制如下:求最大提升程度
因为只有第一针和第二针会产生效果,所以枚举第一针,先算出最佳的第一针和第三针的位置,然后找离第一针和第三针最近的位置即可。
找最近的位置需要二分去找,找到取 二分结果前后的位置取最优即可。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
string s;
cin >> s;
ll k, w, q;
cin >> k >> w >> q;
vector<int> p;
for(int i = 0; i < s.size(); i++)
if(s[i] == '0') p.emplace_back(i);
ll res = 0;
for(int i = 1; i < p.size(); i++)
int x = p[i] - k, y = p[i] + k;
int p1 = lower_bound(p.begin(), p.end(), x) - p.begin();
int p2 = lower_bound(p.begin(), p.end(), y) - p.begin();
int mn1 = min(abs(p[p1] - x), abs(p[p1 - 1 == -1 ? 0 : p1 - 1] - x));
int mn2 = min(abs(p[p2 == p.size() ? p2 - 1 : p2] - y), abs(p[p2 - 1] - y));
res = max(res, max(0ll, w - mn1 * q) + max(0ll, w - mn2 * q));
cout << res << "\\n";
return 0;
以上是关于二分疫苗小孩的主要内容,如果未能解决你的问题,请参考以下文章