1.题目描述:
B.XC的缎带(黄色)
成绩 | 0 | 开启时间 | 2017年05月14日 Sunday 09:30 |
折扣 | 0.8 | 折扣时间 | 2017年05月12日 Friday 19:55 |
允许迟交 | 是 | 关闭时间 | 2017年05月14日 Sunday 15:00 |
题目描述
女孩子都喜欢漂亮的缎带,XC也不例外。DY在玩XC的缎带时,不小心在缎带上弄了几个洞,DY很害怕。为了不被XC责怪,他决定把缎带修好。现在DY有一根布条和一把剪刀,剪刀可以把布条剪成多段。他认为只要用布条把所有的洞都盖上,XC就一定看不出来。DY不喜欢用剪刀,他想知道最少剪几次布条就能把所有的洞都补上。
输入
第一行是两个数字n和x(0<x<=n<=1000),表示缎带的长度和布条的长度。
第二行是n个数字,第i个数字表示i位置缎带的状态,0表示在这个位置有一个洞,1表示这个位置是完整的。
输出
输出一个数字,表示最少需要剪几次。如果无法修补,输出-1。
样例输入
8 5
1 1 0 0 1 0 1 0
样例输出
1
提示
例子中缎带长度为8,布条长度为5
若用2表示布条覆盖的位置,可以用下面的一种情况来修补
1 1 2 2 2 2 1 2
长度为5的布条被剪了1次,两段长度分别为4和1。
3.解题思路:
0肯定要补,现在就考虑被0夹着的1,考虑记录被0夹着的1的多少,排个序,算出补完所有0还剩下多少布条,然后贪心地拿剩下的“补”回给它。
4.AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100100
#define lson root << 1
#define rson root << 1 | 1
#define lent (t[root].r - t[root].l + 1)
#define lenl (t[lson].r - t[lson].l + 1)
#define lenr (t[rson].r - t[rson].l + 1)
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
int a[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int n, x;
while (~scanf("%d%d", &n, &x))
{
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
a[0] = a[n + 1] = 1;
vector<int> cut;
bool flag = 0;
int cnt = 0, count = 0;
for (int i = 1; i <= n + 1; i++)
if (flag && a[i])
cnt++;
else if (!a[i])
{
count++;
if (flag && cnt > 0)
cut.push_back(cnt);
cnt = 0;
flag = 1;
}
if (count > x)
{
puts("-1");
continue;
}
int res = x - count;
sort(cut.begin(), cut.end());
int sz = cut.size();
int save = 0;
for (int i = 0; i < sz; i++)
if (res >= cut[i])
{
res -= cut[i];
save++;
}
else
break;
printf("%d\n", sz - save);
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}