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
资源
推荐
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);
}
}