度度熊剪纸条

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. 转 让Python在Android系统上飞一会儿

    让Python在Android系统上飞一会儿 地址: http://blog.csdn.net/ccwwff/article/details/6208260

  2. Mouse Without Borders软件,主要功能备忘录

    详细地址:https://blog.csdn.net/andylauren/article/details/64540500

  3. January 14th, 2018 Week 02nd Sunday

    Embrace your life, for we only live once. 拥抱你的生活,因为我们只能活一次. We just live once, so I would rather liv ...

  4. July 10th, Week 29th Sunday, 2016

    Everything is good when new, but friend when old. 老朋友更醇香. When did you meet with your last friends l ...

  5. Cocoapods的安装和使用(2018-08-07更新)

    一.Cocoapods的安装 第一步:打开终端 第二步:修改ruby镜像引用 gem source --remove https://rubygems.org/ gem sources -a http ...

  6. IO流_SequenceInputStream(序列流)

    SequenceInputStream(序列流):就是将多个流合成一个有序的流 需求:将三个文件中的数据合并到一个文件中 import java.io.FileInputStream; import ...

  7. swift的调用约定

    swift的静态绑定 Swift Calling Convention @convention(swift) func foo(_ x:Int, y:Int) sil @foo : $(x:Int, ...

  8. 捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(二)

    海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图 ...

  9. 【洛谷】【模拟+栈】P4711 「化学」相对分子质量

    [题目传送门:] [戳] (https://www.luogu.org/problemnew/show/P4711) [算法分析:] 关于一个分子拆分后的产物,一共有三种情况: 原子 原子团 水合物 ...

  10. B+ Tree vs B Trees

    原文地址:https://blog.csdn.net/dashuniuniu/article/details/51072795 引子 最近一直回顾自己曾经写的一些文档,有一篇是关于 Clang Rew ...