Nepire的校OJ入门题解—蓝桥选拔篇(六)

欢迎来到Nepire的校OJ入门题解——————蓝桥选拔篇(六)

这次我主要是讲解第八届蓝桥杯全国软件和信息技术专业人才大赛校内选拔赛的七道题目,中间可能会扯到一些其他东西,然后就开始我们的入门题解吧呜喵

Problem F:划分办公区域

Description

有n块连续的办公区域,每块办公区域能容纳的人数分别为a1,a2,a3,a4…an,现在boss下令,要求把这些办公区域重新划分为k块,且每块办公区域能容纳的数量相同。
已知将一块办公区域拆分成两块办公区域或者把两块办公区域合并成一块办公区域需要消耗1点材料,问完成目标所需要的最少材料是多少? 若无法完成,输出-1.

Input

输入数据的第一行有一个整数T,表示有T组测试数据。
每组数据的第一行有两个整数n,k (0 < n,k < 1000)
接下来一行有n个整数,表示 a1,a2,a3…an(0 < ai < 1000)。

Output

输出一个整数,表示需要消耗的最少材料,如果不能完成,输出-1.
每组测试数据输出一行。

Sample Input

2
2 3
4 6
3 4
1 2 1

Sample Output

-1
1

Source

解题思路

这题算得上有些技巧性了,小Nep凭借着惊人的脑洞把这题解出来,小Nep把这个办公区域想象成一个很长的长方体,emmmm我想想

就是这个样子,里面的除了两边的每条竖线都是可以拿走的活动板,所以就有n-1块可以调整的墙板,要分成k个区域,就需要k-1块板,于是小Nep就想到了,那就把板全拆下来再装上去,这样就需要(n+k-2)点体力,如果要省下体力的话,就是把之后需要墙的位置如果原来有墙就不拆掉,那样就相当与省去拆的一点体力和装的一点体力共两点体力,所以要花费的最小体力就是(n+k-2)-2*(不用拆的墙数)

参考代码

#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wchar.h>
#include <wctype.h>
#include <assert.h>
#include <limits.h>
#include <locale.h>
#include <math.h>
#include <stdio.h>
#define m 1001
int i,t,n,k,a[m],sum=0,ave=0,ans,yy,j,suma;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        sum=0;
        yy=0;
        scanf("%d%d",&n,&k);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }

        if(sum%k != 0)
        {
            printf("-1\n");
        }
        else
        {
            ave=sum/k;
            ans=n+k-2;
            for(i=0;i<k-1;i++)
            {
                yy += ave;

                for(j=0;j<n-1;j++)
                {
                    suma += a[j];
                    if(suma==yy)
                    {
                        ans -= 2;
                    }

                }
                suma=0;//suma??0

            }
            printf("%d\n",ans);
        }

    }
    return 0;
}

下次蓝桥校选拔16最终回,欢迎大家在下面评论建议

——Nepire

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页