Cooking Schedule Problem Code: SCHEDULE(优先队列)
Cooking Schedule Problem Code: SCHEDULE
As you might know, cooking is not an easy job at all and cooking everyday makes the chef very tired. So, Chef has decided to give himself some days off.
Chef has made a schedule for the next N days: On i-th day if Ai is equal to 1 then Chef is going to cook a delicious dish on that day, if Ai is equal to 0 then Chef is going to rest on that day.
After Chef made his schedule he discovered that it's not the best schedule, because there are some big blocks of consecutive days where Chef will cook which means it's still tiring for Chef, and some big blocks of consecutive days where Chef is going to rest which means chef will be bored doing nothing during these days.
Which is why Chef has decided to make changes to this schedule, but since he doesn't want to change it a lot, he will flip the status of at most K days. So for each day which Chef chooses, he will make it 1 if it was 0 or he will make it 0 if it was 1.
Help Chef by writing a program which flips the status of at most K days so that the size of the maximum consecutive block of days of the same status is minimized.
Input
The first line of the input contains an integer T denoting the number of test cases.
The first line of each test case contains two integers: N denoting the number of days and K denoting maximum number of days to change.
The second line contains a string of length N , of which the i-th character is 0 if chef is going to rest on that day, or 1 if chef is going to work on that day
Output
For each test case, output a single line containing a single integer, which is the minimum possible size of maximum block of consecutive days of the same status achievable.
Constraints
- 1 ≤ T ≤ 11,000
- 1 ≤ N ≤ 106
- The sum of N in all test-cases won't exceed 106.
- 0 ≤ K ≤ 106
- 0 ≤ Ai ≤ 1
Subtasks
- Subtask #1 (20 points): N ≤ 10
- Subtask #2 (80 points): Original Constraints
Example
Input:
2
9 2
110001111
4 1
1001
Output:
2
2
思路:
用大根堆存连续相同序列的长度,同时存下标号及切割次数(为了在最长的连续序列相同的前提下先切切割次数少的,因此要先用一个大一些的数代表切割0次,每切割一次这个数减1),用另一个数组记录这个序列的最初长度。每次切割长度最长的序列,长度变成最初的长度/(切割次数+1),再次加进堆(只需加一段即可)。直到剩下的最长长度只有2。对于小于2的情况,特殊处理即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
using namespace std;
int _;
int n,k,a[];
char c[];
priority_queue <pair<int,pair<int,int>>> q;
int main()
{
scanf("%d",&_);
while (_--)
{
scanf("%d%d",&n,&k);
scanf("%s",c);
while (!q.empty()) q.pop();
int tot=,cnt=;;
int i;
for (i=;i<n;i++)
if (c[i]==c[i-]) tot++;
else
{
//cout<<tot<<endl;
q.push({tot,{,cnt}});
a[cnt]=tot;
cnt++;
tot=;
}
q.push({tot,{,cnt}});
a[cnt]=tot;
cnt++;
if (q.top().first==)
{
puts("");
continue;
}
char p='';
tot=;
int len=strlen(c);
for (i=;i<len;i++)
{
if (c[i]!=p) tot++;
if (p=='') p=''; else p='';
}
if (tot<=k)
{
puts("");
continue;
}
p='';
tot=;
for (i=;i<len;i++)
{
if (c[i]!=p) tot++;
if (p=='') p=''; else p='';
}
if (tot<=k)
{
puts("");
continue;
}
//cout<<"hhhhhhhhhh"<<endl;
//cout<<q.top()<<endl;
int x;
while (k--)
{
x=q.top().first;
if (x<=) break;
int ix=q.top().second.second;
int nval=a[ix];
int id=q.top().second.first;
id--;
int im=-id;
x=nval/(im+);
q.pop();
q.push({x,{id,ix}});
}
printf("%d\n",q.top().first);
}
return ;
}
Cooking Schedule Problem Code: SCHEDULE(优先队列)的更多相关文章
- hdu 1534 Schedule Problem (差分约束)
Schedule Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDOJ 1534 Schedule Problem 差分约束
差分约数: 求满足不等式条件的尽量小的值---->求最长路---->a-b>=c----> b->a (c) Schedule Problem Time Limit: 2 ...
- Maker's Schedule, Manager's Schedule
http://www.paulgraham.com/makersschedule.html manager's schedule 随意性强,指随时安排会面,开会等活动的 schedule; maker ...
- POJ 3553 Task schedule【拓扑排序 + 优先队列 / 贪心】
Task schedule Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 515 Accepted: 309 Special J ...
- ZOJ 1455 Schedule Problem(差分约束系统)
// 题目描述:一个项目被分成几个部分,每部分必须在连续的天数完成.也就是说,如果某部分需要3天才能完成,则必须花费连续的3天来完成它.对项目的这些部分工作中,有4种类型的约束:FAS, FAF, S ...
- Schedule Problem spfa 差分约束
题意:有n个任务,给出完成n个任务所需时间,以及一些任务安排.任务安排有四种: FAS a b:任务a需在任务b开始后完成. FAF a b:任务a需在任务b完成后完成. SAF a b:任务a需在任 ...
- HDU-1534 Schedule Problem
四种约束条件..照做就行了.. 最长路建图. #include <cstdio> #include <cstdlib> #include <cstring> #in ...
- lr11.0负载测试 real-world schedule 与basic schedule的区别是什么
real-world schedule 是真实场景模式 可以通过增加ACTION来增加多个用户 basic schedule 是我们以前用的 经典模式 只能设置一次负载的上升和下降
- Holes in the text Add problem to Todo list Problem code: HOLES
import sys def count_holes(letter): hole_2 = ['A', 'D', 'O', 'P', 'Q', 'R'] if letter == 'B': return ...
随机推荐
- Makefile介绍
make 工具如 GNU make.System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同.不同的make工具的mak ...
- 洛谷 P1765 手机_NOI导刊2010普及(10)
题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 # 要按出英文字母就必须要按数字键多下.例如要按出 ...
- 洛谷 P1434 滑雪
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
- 聊聊JavaScript和Scala的表达式 Expression
我们先看下面这段简单的JavaScript代码. 我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式. 函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其 ...
- dmesg -检测和控制内核环缓冲
NAME dmesg - print or control the kernel ring buffer 总览 dmesg [ -c ] [ -n 级别 ] [ -s 缓冲区大小 ] 描述 dmesg ...
- iview tabs里面放入 i-switch 注意slot不是写在 props里面
iview tabs里面放入 i-switch 注意slot不是写在 props里面 <Tabs value="name1"> <TabPane :label=& ...
- Spring-01 注解实现IOC
Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...
- 全新Ubentu系统没有make,gcc命令解决办法
一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc
- ArrayList 和 LinkedList 区别。
1. ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用.他们都可以对元素的增删改查进行操作. 2. ArrayList是实现了基于动态数组的数据结构,L ...
- PHP中的预定义常量、类常量和魔术常量的区别
PHP 向它运行的任何脚本提供了大量的预定义常量.不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 对于一些基本的常量是这些常量在 ...