HDU 5933 ArcSoft's Office Rearrangement 【模拟】(2016年中国大学生程序设计竞赛(杭州))

ArcSoft的办公室重组

时间限制:2000/1000 MS(Java / Others)内存限制:65536/32768 K(Java / Others)
总提交数:3648接受提交内容:1138

问题描述

ArcSoft,Inc。是全球领先的专业计算机摄影和计算机视觉技术公司。

ArcSoft公司有N个工作区,形成一条直线。ArcSoft的CEO认为每个块应该有相同数量的员工,所以他想通过以下两个操作将当前块重新排列成K个新块:

- 将两个相邻块合并为一个新块,以及新块的大小是两个旧街区的总和'。
- 将一个块拆分为两个新块,并且可以指定每个块的大小,但总和应该等于旧块。

现在首席执行官想知道 将当前区块重新安排到K区块的  最小操作,请大家帮忙。

输入

第一行包含一个整数T,表示测试用例的数量。

每个测试用例都以一行开头,其中两行为N和K,即旧块和新块的数量。

第二行包含N个数字a1,a2,...,aN,表示当前块的大小。

限制
1≤T≤100
1≤N≤105
1≤K≤105
1≤ai≤105

产量

对于每个测试用例,您应输出  'Case #x:y',其中  x  表示案例编号,从1开始计数   ,  y  是最小操作。

如果首席执行官无法重新安排具有相同规模的K个新区块,则  y  等于  -1

样本输入

3 1 3 14 3 1 2 3 4 3 6 1 2 3

样本输出

案例#1:-1案例#2:2案例#3:3

资源

2016年中国大学生程序设计竞赛(杭州)

推荐

liuyiding

题解:

  原有Ñ个有顺序的车间,大小分别位艾,现在要把这Ñ个车间重新划分成中号个(只能合并相邻的,分解),要求每个区间大小相等,问是否有解。(合并区间与拆分区间)

  【模拟】

  无解的情况是N个区间的总大小sum mod M!= 0

  其实题目就是给你一个总长位总和的Ñ个区间,要求你合并相邻的两个或拆开一个大区间,使得最后的每个区间大小都为总和/ M。

  那么如果原先的分界线和最终的分界线相同,那么就不必对这个分界线进行合并。

  有解的时候可以知道每个新区间的大小X,所以只要看艾的前缀和里是否有X的倍数,如果有则这个位置不用操作。

  总共需要合并N-1次,拆分M-1次,扣掉不需要的操作T * 2次,即为答案。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
long long ans,sum,block;
int a[100010];
long long s[100010];
int main(){
	int T;
	scanf("%d",&T);
	for(int i=1;i<=T;i++){
		s[0]=0;
		ans=0,sum=0;
		scanf("%d%d",&n,&m);
		for(int j=1;j<=n;j++){
			scanf("%d",&a[j]);
			s[j]=s[j-1]+a[j];
			sum=sum+a[j];
		}
		if(sum%m!=0){
			ans=-1;
		}else{
			block=sum/m;
			for(int j=1;j<=n;j++){
				if(s[j]%block==0)
				    ans=ans-2; 
			}
			ans=ans+n+m; 
		}
		printf("Case #%d: %lld\n",i,ans);
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值