思路大体相同,可惜最后没有特判结尾
因 为 负 数 温 度 形 成 一 个 一 个 的 连 通 块 因为负数温度形成一个一个的连通块 因为负数温度形成一个一个的连通块
那 么 一 开 始 假 设 最 坏 , 在 每 个 连 通 块 的 开 始 换 冬 季 轮 胎 那么一开始假设最坏,在每个连通块的开始换冬季轮胎 那么一开始假设最坏,在每个连通块的开始换冬季轮胎
在 每 个 连 通 块 的 结 尾 换 夏 季 轮 胎 在每个连通块的结尾换夏季轮胎 在每个连通块的结尾换夏季轮胎
接 下 来 发 现 连 通 块 之 间 假 如 不 换 任 何 轮 胎 可 以 减 少 2 次 换 轮 胎 次 数 接下来发现连通块之间假如不换任何轮胎可以减少2次换轮胎次数 接下来发现连通块之间假如不换任何轮胎可以减少2次换轮胎次数
但 是 这 样 会 让 冬 季 轮 胎 多 用 几 天 但是这样会让冬季轮胎多用几天 但是这样会让冬季轮胎多用几天
所 以 把 所 有 连 通 块 的 间 隔 天 数 扔 进 优 先 队 列 即 可 所以把所有连通块的间隔天数扔进优先队列即可 所以把所有连通块的间隔天数扔进优先队列即可
但是注意,最后一次可能可以直接用到结尾,特判
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,m,a[maxn],top;
struct p{
int l,r;
}id[maxn];
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++)
{
if(a[i]<0)
{
id[++top].l=i;
while(a[i]<0)
{
id[top].r=i;
i++;
}
m-=(id[top].r-id[top].l+1);
i--;
}
}
int ans=top*2;
if(m<0) { cout<<-1; return 0; }
for(int i=2;i<=top;i++)
q.push(id[i].l-id[i-1].r-1);
while( !q.empty() )
{
int minn=q.top(); q.pop();
if(m-minn>=0) m-=minn,ans-=2;
else break;
}
if(top&&m>=(n-id[top].r)) ans--;
cout<<ans;
}