Codeforces 747D. Winter Is Coming

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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值