疫苗小孩(二分)

'#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

const int N = 2e6 + 10;
#define int long long

int n;
string s;
int k, w, q;
int a[N], m;
int findl (int tar, int i) {
    int l = 1, r = i;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if (a[mid] <= tar)  l = mid;
        else r = mid - 1;
    }
    return l;
}
int findr (int tar, int i) {
    int l = i, r = m;
    while (l < r) {
        int mid = l + r>> 1;
        if (a[mid] >= tar) r = mid;
        else l = mid + 1;
    }
    return l;
}
void solve() {
    scanf("%d", & n);
    cin >> s;
    cin >> k >> w >> q;
    for (int i = 0; i < n; i ++) {
           if (s[i] == '1') continue;
        a[++m] = i + 1;
    }
    int ans = 0;
    for (int i = 1; i <= m; i ++) {
        int l = findl(a[i] - k, i);
        int r = findr(a[i] + k, i);
        int aa = 0, bb = 0;
        if (l != i)
		    aa= w - abs(k - abs(a[i] - a[l])) * q;
        if (l + 1 != i && l + 1 < i) {
            aa = max (aa, w - abs(k - abs(a[i] - a[l + 1])) * q);
        }
		if (r != i)
             bb= w - abs(k - abs(a[i] - a[r])) * q;
        if (r - 1 != i && r - 1 > i) {
            bb = max (bb,  w - abs(k - abs(a[i] - a[r - 1])) * q);
        }
        ans = max (ans, aa + bb);
        
    }
    cout << ans << endl;
}
signed main () {
   solve();
}'

这题并不难,但是我在想到做法的时候,以为实现难度会很高,就放弃了。这是不行的,我们应该尽量让问题简单一点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值