度度熊剪纸条

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. Django电商项目---完成用户中心(订单中心+收货地址)day7

    完成用户中心(收货地址) df_user/views.py df_user/urls.py templates/df_user/user_center_site.html 界面显示 完成用户中心(全部 ...

  2. Win10 + MASM32 + EditPlus 汇编语言编程环境设置

    下载安装MASM32汇编环境 官方下载站:MASM32 环境变量配置 配置MasmHome变量,值为masm32的安装目录: 配置include和lib变量 include : %MasmHome%\ ...

  3. 第 16 章 C 预处理器和 C 库(可变参数:stdarg.h)

    /*------------------------------------------------- varargs.c -- use variable number of arguments -- ...

  4. ByteArrayInputStream与ByteArrayOutputStream_操作数组的流

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...

  5. 多个Activity和Intent

    Intent是Android应用程序组件之一,在Android系统当中表示一种意图,Intent中包含了一组信息: 最重要的内容是action(动作)和data(数据) Component name ...

  6. centos7下安装docker(12docker网络)

    docker 网络荣覆盖范围可分为:单个host上的容器网络和跨多个host的网络 docker 安装时会自动在host上创建三个网络,我们可以使用docker network ls查看到 1.non ...

  7. Domain Adaptation (1)选题讲解

    1 所选论文 论文题目: <Unsupervised Domain Adaptation with Residual Transfer Networks> 论文信息: NIPS2016, ...

  8. log4j2的环境变量使用

    官方文档  http://logging.apache.org/log4j/2.x/manual/lookups.html#EnvironmentLookup

  9. OnlineJudgeServer运行

    我在这如下这两篇文章都说过青岛OJ相关的 OnlineJudgeFE之前端二次开发 青岛大学开源OJ平台搭建 今天我还是要来讲讲关于这个青岛OJ. 青岛OJ采用的是完全的前后端分离架构. Online ...

  10. Android 其他特效展示

    Android开源项目发现----其他特殊效果篇(持续更新) 发表时间:2014-03-01 15:10:10   来源:本站整理   浏览(160)   Android开源项目发现----其他特殊效 ...