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 ...
 
随机推荐
- BZOJ_3786_星系探索_splay维护出栈入栈序
			
BZOJ_3786_星系探索_splay维护出栈入栈序 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为 ...
 - 前端调用后端接口返回200(成功状态码),后端有返回,但是控制台Network Response为空,没展示任何信息
			
解决方法: 1.在js里面debugger,可以看到后台是否有返回数据. 2.直接console.log(),直接把返回值打印出来,查看返回的数据格式,方便前端进行数据的处理. PS:因为后端返回的数 ...
 - windows切换到谷歌浏览器黑屏问题
			
打开谷歌浏览器,找到右上角,点击设置,如下: 点击高级设置,如下: 关闭使用硬件加速模式,重新打开浏览器,即可.
 - SSAS GUID 添加 行计数,非重复计数 等 遇到的莫名其妙的问题
			
在基于某个GUID 进行非重复性计数时 需要对GUID 转换类型,如:CAST(ColumnName as varchar(36)) 可参考:http://stackoverflow.com/ques ...
 - [poj2778]DNA Sequence(AC自动机+矩阵快速幂)
			
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...
 - Flutter实战视频-移动电商-54.购物车_商品列表子项布局
			
54.购物车_商品列表子项布局 子项做成一个单独的页面 新建cartItem.dart文件 新建cart_page文件夹,在里面新建cart_item.dart页面, 页面名字叫做CartItem 定 ...
 - E20190404-hm
			
prepend vt. 预先考虑,预先计划,预谋;
 - E20180514-hm
			
invalid adj. 无效的; 不能成立的; 有病的; 病人用的; readiness n. 准备就绪; 愿意,乐意
 - springboot2.x 的 RedisCacheManager变化
			
springboot2.x 的 RedisCacheManager变化 springboot2.x 的 RedisCacheManager变化 由于最近在学着使用redis做缓存,使用的是spring ...
 - bzoj1139:[POI2009]Wie
			
传送门 状压dp,最短路 spfa似乎特别慢 代码: #include<cstdio> #include<iostream> #include<algorithm> ...