北理2017校赛 - B.XC的缎带 - 排序+贪心

28 篇文章 0 订阅
4 篇文章 0 订阅

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不喜欢用剪刀,他想知道最少剪几次布条就能把所有的洞都补上。

 

输入

第一行是两个数字nx(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次,两段长度分别为41


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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值