Codeforces 747D. Winter Is Coming
传送门:https://codeforces.com/problemset/problem/747/D
题目大意:
一个长达n天冬天到了,当气温为负时,你得使用冬天的轮胎,其它时候随意,但你的冬天轮胎只能使用k天,它会为你提供n,k的值和冬天的每日气温,你要求的是最少的换胎次数。
主要想法:
首先,假设每个负的天只在用之前换上,用之后也立马换回去,假如有l个负天,则应换l次,但当k足够大时,如果两个负天之间我可以不用换轮胎,则可以少换2次,依此类推,为此,我们需要了解到的是哪些天是负天,它们每两个中间又有多少个非负天。这个可以在输入时解决。然后根据上面的思路就可以基本解决,但仍需考虑的是,如果最后一天是负天,则可以少换一次,如果k太小,比l还小,则只能输出-1,等等小细节。
代码如下:
#include <bits/stdc++.h>
using namespace std;
vector<int> t;
int main()
{
int n,k,l=0,m=0,d[200100],p=0,q=0,a,i;
cin >>n>>k;
t.push_back(0);
for(i=0;i<n;++i)
{
cin >>d[i];
if(d[i]<0)
{
++l;
t.push_back(0);
}
else
{
++*(t.end()-1);
}
}
t.erase(t.begin());
if(d[n-1]<0)p=1;
if(t.size()==0)
{
cout<<'0'<<endl;
return 0;
}
if(k<l)
{
cout<<-1<<endl;
return 0;
}
if(0==*(t.end()-1))t.erase(t.end()-1);
a=*(t.end()-1);
k-=l;
if(t.size()>0)sort(t.begin(),t.end());
for(i=0;i<t.size();++i)
{
if(k>=t[i])
{
k-=t[i];
++m;
}
else break;
}
if(i==t.size())q=1;
else if(t[i]>a&&t[i-1]>=a&&k+a<t[i])q=1;
if(p)q=0;
cout<<2*(l-m)-p+q<<endl;
return 0;
}