度度熊剪纸条

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1397    Accepted Submission(s): 206

Problem Description
度度熊有一张纸条和一把剪刀。

纸条上依次写着 N 个数字,数字只可能是 0 或者 1。

度度熊想在纸条上剪 K 刀(每一刀只能剪在数字和数字之间),这样就形成了 K+1 段。

他再把这 K+1 段按一定的顺序重新拼起来。

不同的剪和接的方案,可能会得到不同的结果。

度度熊好奇的是,前缀 1 的数量最多能是多少。

 
Input
有多组数据,读到EOF结束。

对于每一组数据,第一行读入两个数 N 和 K 。

第二行有一个长度为 N 的字符串,依次表示初始时纸条上的 N 个数。

0≤K<N≤10000

所有数据 N 的总和不超过100000

 
Output
对于每一组数据,输出一个数,表示可能的最大前缀 1 的数量。
 
Sample Input
5 1
11010
5 2
11010
 
Sample Output
2
3
 
Source
 
 
 
最开始想贪贪心,排序过,后来发现被坑了。。。TMD想到背包都不敢写,害得我复赛都没进。。。最前面是1只需要减一次的如111000,最后面是1也只需要减去1次,00001111,有人肯定觉得。。。0001100也减出一次就行了,但是。。。这种减法就。。。比较坑了,我们可以想想,这种减去了。。。后面就是0了,这样拼接就比较麻烦。。。我们不妨这样想。。。我们整个过程只最多满足一个不是1111类型的,而是111110000这种后面接0 的,这种减是只需要一次了,但是还有一个问题,如果我把中间的一个在能切割的范围内放在最后,那么就少切割一次,意思就是 011001111001 这样的一个串,我可以用5 次切出来全部是1 但是实际上我只需要切4次就可以,因为我可以将11放最后或者将1111放最后,也就是组成的串为1,11,111100,00,0 或者 1,1111,1100,00,0;为了满足这种情况,我们把背包容量+1,除了前导全是1,后导全是1的费用为1 ,其他费用为2,即可,跑一个01背包岂不是美滋滋???不好意思我的写法比较菜。。。这样特判会造成一种特殊情况,就是K=0时,因为我是把背包容量++,尼玛K=1,要是有前导1或者后导1,岂不是GG??特判即可。。。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxx =;
struct node
{
int cost,val;
} one[maxx];
char a[maxx];
bool b[maxx];
int dp[maxx];
int main()
{
int n,k;
int ans=;
int pre;
int bak;
while(~scanf("%d%d",&n,&k))
{
ans=;
pre=;
bak=;
memset(one,,sizeof(one));
scanf("%s",a);
int len=strlen(a);
for(int i=; i<=len; i++)
{
if (a[i-]=='')
{
b[i]=;
}
else
{
b[i]=;
}
}
if (b[]==)pre=;
if (b[n]==)bak=;
int flag=;
int cnt=;
one[].cost=;
for (int i=; i<=len; i++)
{
if (flag== && b[i]==){
continue;
}
else if (b[i]== && (flag== || flag==))
{
one[cnt].val++;
flag=;
continue;
}
else if (b[i]== && flag==)
{
one[++cnt].val++;
one[cnt].cost=;
flag=;
continue;
}
if (b[i]== && (flag== || flag==))
{
flag=;
continue;
}
}
if (pre)one[].cost=;
if (bak)one[cnt].cost=;
memset(dp,,sizeof(dp));
//特判0
if(k==){
if (pre){
printf("%d\n",one[].val);
}else{
printf("0\n");
}
continue;
}
// for (int i=1;i<=cnt;i++){
// cout<<one[i].val<<" "<<one[i].cost<<endl;
// }
//01背包
k++;
for (int i=;i<=cnt;i++){
for (int j=k;j>=one[i].cost;j--){
dp[j]=max(dp[j],dp[j-one[i].cost]+one[i].val);
}
}
printf("%d\n",dp[k]);
}
return ;
}

百度之星-day1-1003-度度熊剪纸条的更多相关文章

  1. 百度之星 资格赛 1003 度度熊与邪恶大魔王 dp(背包)

    度度熊与邪恶大魔王  Accepts: 1141  Submissions: 6840  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 3 ...

  2. 百度之星资格赛 1003 度度熊与邪恶大魔王(二维dp)

    分析 挺好的一道题 dp[i][j]表示打败i颗血j防御力的怪兽需要的最少宝石数 然后就好了,复杂度\(O(n+m*1000*10)\) #include <bits/stdc++.h> ...

  3. HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. HDU - 6113 2017百度之星初赛A 度度熊的01世界

    度度熊的01世界  Accepts: 967  Submissions: 3064  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 327 ...

  5. 百度之星资格赛 1004 度度熊的午饭时光(01背包+最小序号和+字典序+有bug)

    分析 首先声明一下,我的代码有漏洞的,求大神给个正确代码 思路如下: 首先做一遍01背包记录路径并求出最大总分,令path[i][j]表示第i个物品包含在dp[j]的求值过程中.再逆序枚举money, ...

  6. HDU-6376 度度熊剪纸条

    链接 http://acm.hdu.edu.cn/showproblem.php?pid=6376 分析 这道题好像不是很难,因为是要拼出前缀1,所以确定剪下每一段1需要的刀数,然后因为有次数限制,所 ...

  7. hdu6376 度度熊剪纸条

    思路: 01背包.有些细节需要注意一下,比如k = 0的情况. 实现: #include <bits/stdc++.h> using namespace std; typedef pair ...

  8. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  9. 模拟 2015百度之星资格赛 1003 IP聚合

    题目传送门 /* 模拟水题,排序后找出重复的ip就可以了 */ #include <cstdio> #include <iostream> #include <algor ...

随机推荐

  1. 第五章 绘图基础(ALTWIND)

    线上箭头表示画线的方向.WINDING模式和ALTERNATE模式都会填充三个封闭的L型区域,号码从1到3.两个更小的内部区域,号码为4和5,在ALTERNATE模式下不被填充.但是在WINDING模 ...

  2. <20180927>新开一篇章记录常用到的IT名词

    (一)有些名词在市场化的今天用的很多,和IT的名词重叠和易混淆, 有些缩写根本连外国人都很少用, 国人却用的津津乐道.这篇是专门用来记录的. 1.1 SMB , 这个在IT领域用的很多, 阐述的是 “ ...

  3. Android Studio IDE的 LogCat如何过滤指定应用的调试信息

    http://blog.csdn.net/wangqing830414/article/details/40377979 打开 LogCat在搜索框右侧的No Filters中选择 Edit Filt ...

  4. day15 Python风湿理论之函数即变量

    eg1.定义foo门牌号,调用foo函数,打印,再找bar门牌号,找不到,报错 def foo(): print('from foo') bar() foo() 结果:报错 from foo Trac ...

  5. Qt+QGIS二次开发:开发环境搭建(超级详细)

    原文链接: 1.qgis二次开发环境搭建(超级详细) 2.QGIS开发教程(1)——QGIS开发准备工作 3.QGIS(2.18.15 源码)+Qt(5/5.9.3)+VS2015(X64)编译

  6. 类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目

    1. 简介 QtCreator是一个十分好用的跨平台IDE,由于最近需要在Windows和Mac同时写一个C++的代码,使用VS和XCode不能实现项目的统一管理(可以使用cmake来组织源码,但是每 ...

  7. rosdep update 超时

    https://blog.csdn.net/azhuty/article/details/41209957 http://www.cnblogs.com/wangyarui/p/6059688.htm ...

  8. PAT A1076 Forwards on Weibo (30 分)——图的bfs

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  9. 关于Nginx

    访问 www.a.com 自动跳到 www.b.com(301跳转设置) server { listen 80; server_name www.a.com; rewrite ^/(.*)$  htt ...

  10. 上传文件,不依赖 Jquery flash 插件,用到HTML5 input 新属性实现过滤文件格式、同时上传多个文件

    1.样式 2.js 3.后台处理 4.效果图 一.样式 <style> .divUpload { position: relative; } .divUploadFirst { width ...