CF747D Winter Is Coming
题目链接:
http://codeforces.com/problemset/problem/747/D
题目大意:
接下来的n天内每天都有一个气温,如果某天的温度为负数,则必须使用冬季轮胎;而温度非负,则既可以使用冬季轮胎,也可以使用夏季轮胎。开始的时候车子上装的是夏季轮胎,如果连续两天使用的轮胎类型不同,则需要换胎。规定使用冬季轮胎的总天数不能超过k,问换胎的最少次数。(注:n天结束后车子上装的既可以是冬季轮胎,也可以是夏季轮胎)。
解题思路:
一开始想到dp+滚动数组。然而时间复杂度太高,查了tutorial发现可以贪心。具体来说就是:
1.当温度为负数的天数之和大于k时,无解。
2.否则令k减去温度为负数的天数之和。并求出所有连续的温度为负数的区段的个数cnt,此时换胎次数x最多为cnt*2。
3.求出所有连续的温度为非负数的区段,并将这样的区段的长度push到一个小顶堆中。先不考虑持续到第n天的非负区段(如果有的话),不要将这样的区段放入堆中(之后判断这种特殊情况)。也不必考虑从第1天开始持续到第一个负区段之前的非负区段,因为一开始车子上的是夏季轮胎,这样的区段不会影响最终结果。
4.当堆不空并且k大于等于堆顶元素的时候,将堆顶元素pop出来,同时将k减去堆顶元素,并且令x -= 2。(相当于贪心地合并掉非负区段)
5.考虑特殊情况:如果存在一个非负区段并且这个区段持续到第n天,并且此时k大于等于这个区段的长度,则可以x--(相当于最后一次不换回夏季轮胎,省掉一次换胎操作);或者最后一个负区段持续到第n天,这种情况也可以省掉一次换回夏季轮胎的操作,也要x--。总之,无论持续到n天的最后一个区段是负区段还是非负区段,都要x--。这样就得到了最终答案。
其实思路不是很难想,但是实现起来需要注意一些细节。
代码写得不是很漂亮:
#include <iostream>
#include <cstdio>
#include <queue>
#include <functional>
#include <vector>
using namespace std; int a[], n, k;
int find_non_negtive_start(int pos)
{
for (int i = pos; i < n; i++)
{
if (a[i] >= )
return i;
}
return -;
}
int find_non_negtive_end(int pos)
{
for (int i = pos; i < n; i++)
{
if (a[i] < )
return i - ;
}
return -;
}
int find_negtive_start(int pos)
{
for (int i = pos; i < n; i++)
{
if (a[i] < )
return i;
}
return -;
}
int find_negtive_end(int pos)
{
for (int i = pos; i < n; i++)
{
if (a[i] >= )
return i - ;
}
return -;
}
int main()
{
priority_queue<int, vector<int>, greater<int> > q;
cin >> n >> k;
int cnt = , cnt_negtive = ;
int start = -, begin = -;
for (int i = ; i < n; i++)
{
scanf("%d", &a[i]);
if (a[i] < )
{
cnt++;
if (begin == -)
begin = i;
}
else
{
if (begin != - && start == -)
start = i;
}
}
if (cnt > k)
{
cout << "-1" << endl;
return ;
}
if (cnt == )
{
cout << "" << endl;
return ;
}
if (start == -)
{
cout << "" << endl;
return ;
}
if (begin == -)
{
cout << "" << endl;
return ;
}
cnt_negtive = cnt;
cnt = ;
while ()
{
int pos = find_negtive_end(begin + );
if (pos == -)
{
cnt++;
break;
}
cnt++;
begin = find_negtive_start(pos + );
if (begin == -)
break;
}
cnt *= ;
int res = -;
while ()
{
int pos = find_non_negtive_end(start + );
if (pos == -)
{
res = n - start;
break;
}
q.push(pos - start + );
start = find_non_negtive_start(pos + );
if (start == -)
{
break;
}
}
k -= cnt_negtive;
while (!q.empty())
{
if (k >= q.top())
{
k -= q.top();
q.pop();
cnt -= ;
}
else
{
break;
}
}
if (k >= res)
{
cnt--;
}
cout << cnt << endl;
return ;
}
CF747D Winter Is Coming的更多相关文章
- 开发框架Data Abstract和Hydra发布版本Winter 2013
Data Abstract Winter 2013即Data Abstract Version 7.0.73 (Build .1111),Winter 2013版对Data Abstract继续做了以 ...
- 2015 UESTC Winter Training #10【Northeastern Europe 2009】
2015 UESTC Winter Training #10 Northeastern Europe 2009 最近集训都不在状态啊,嘛,上午一直在练车,比赛时也是刚吃过午饭,状态不好也难免,下次比赛 ...
- 2015 UESTC Winter Training #8【The 2011 Rocky Mountain Regional Contest】
2015 UESTC Winter Training #8 The 2011 Rocky Mountain Regional Contest Regionals 2011 >> North ...
- 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】
2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...
- 2015 UESTC Winter Training #6【Regionals 2010 >> North America - Rocky Mountain】
2015 UESTC Winter Training #6 Regionals 2010 >> North America - Rocky Mountain A - Parenthesis ...
- 2015 UESTC Winter Training #4【Regionals 2008 :: Asia - Tehran】
2015 UESTC Winter Training #4 Regionals 2008 :: Asia - Tehran 比赛开始时电脑死活也连不上WIFI,导致花了近1个小时才解决_(:зゝ∠)_ ...
- Winter(bfs&&dfs)
1084 - Winter PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Winter is ...
- Codeforces 839D Winter is here【数学:容斥原理】
D. Winter is here time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...
- Codeforces Round #428 (Div. 2) D. Winter is here 容斥
D. Winter is here 题目连接: http://codeforces.com/contest/839/problem/D Description Winter is here at th ...
随机推荐
- Redis GEO 特性在 LBS 中的应用总结
什么是LBS LBS(Location Based Service),基于位置的服务. Redis和GEO Redis 是最热门的 nosql 数据库之一,它的最大特点就是快.所以在 LBS 这种需要 ...
- CentOS 6.5远程连接工具x shell
安装X shell 在Window系统下远程连接Linux,x shell只是一种远程连接工具,类似工具还有CRT.VNC.putty. 以下是安装X shell的注意事项 此选项中,如不把——初始数 ...
- HDOJ-2047
阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 3、css边框以及其他常用样式
一.边框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- Flutter实战视频-移动电商-66.会员中心_编写ListTile通用方法
66.会员中心_编写ListTile通用方法 布局List里面嵌套一个ListTile的布局效果 里面有很多条记录,以后可能还会增加,所以这里我们做一个通用的组件 通用组件方法 这里使用Column布 ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 27. CICD Azure DevOps
VSTS做持续集成 后来改名叫做Azure Deveps https://azure.microsoft.com/zh-cn/services/devops/ 这是中文的地址 创建一个项目 名称.描述 ...
- Weekly Contest 111-------->941. Valid Mountain Array(max_element)
Given an array A of integers, return true if and only if it is a valid mountain array. Recall that A ...
- HDU4255【BFS】
题意: 给你一个矩阵,矩阵里是的数是这么安排的,然后给你两个数,让你求这两个数的最短距离,素数不能去: 思路: 预处理一下素数表,矩阵,然后找一下起点和终点的坐标,跑一下BFS就好了: #includ ...
- Codevs 1523 地精部落
1523 地精部落 省队选拔赛 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 传说很久以前,大地上居住 ...
- CF960G Bandit Blues(第一类斯特林数)
传送门 可以去看看litble巨巨关于第一类斯特林数的总结 设\(f(i,j)\)为\(i\)个数的排列中有\(j\)个数是前缀最大数的方案数,枚举最小的数的位置,则有递推式\(f(i,j)=f(i- ...