简单分组

原题

最近DH 接手了一个项目组,这个项目组分为N个小组,第i个小组有ai人,但他觉得这个分组方式不合理,想要换一种分组方式。DH的分组方式是把所有人平均分为K组,但他也不想搞得太麻烦,就决定在重新分组时,只采取下面两种操作方法:

1、把两个相邻组合成一组,新组人数为原两组之和;

2、把一组拆成相邻的两组,两组人数可以随意设置,但总人数要等于原来那一组的人数。

问DH最少需要进行多少次操作才可以完成重新分组?

输入

第一行两个整数NK1NK100000

第二行N个整数,a1,a2,...,an1ai100000

输出

如果可以DH可以完成分组,输出最少操作次数,否则输出1

解析

若总人数无法均分为k组,直接输出-1;反之,求出平均值作为每组标准人数,对每组人数a[i]分类讨论:
1.人数小于平均值,将这组人加到下一组中,操作数加一。
2.人数大于等于平均值但不均分,将余数人数加到下一组,操作数相应增加。
3.人数大于等于平均值且均分,将该组人数均分,操作数相应增加即可。

代码


#include<cstdio>
#include<algorithm>
using namespace std;

int a[100007];

int main()
{
    int n,k;
    scanf("%d%d",&n,&k);

    long long sum = 0;
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&a[i]);
        sum += a[i];
    }

    long long ave = sum/k;
    int step = 0;
    if(sum%k)
    {
        printf("-1\n");
    }
    else
    {
        for(int i = 0;i < n;i++)
        {
            if(a[i] < ave)
            {
                a[i+1] += a[i];
                step++;
            }
            else
            {
                if(a[i] % ave)
                {
                    a[i+1] += a[i]%ave;
                    step += a[i]/ave + 1;
                }
                else
                {
                    step += a[i]/ave -1;
                }
            }
        }
        printf("%d\n",step);
    }
}

在执行简单的数据分组查询时,通常使用 SQL 中的 `GROUP BY` 子句。通过 `GROUP BY`,可以将数据按照一个或多个列进行分组,并结合聚合函数(如 `SUM`、`AVG`、`COUNT`、`MAX`、`MIN`)对每个分组进行统计分析。这种方式适用于需要对数据分类汇总的场景,例如统计每个类别的销售总额或每个部门的员工数量。 ### 基本语法 ```sql SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1 ORDER BY column1; ``` ### 示例 假设有一个名为 `sales` 的表,包含以下字段: - `category`:商品类别 - `product_name`:产品名称 - `amount`:销售金额 #### 示例 1:按类别分组并计算总销售额 ```sql SELECT category, SUM(amount) AS total_sales FROM sales GROUP BY category; ``` 此查询会将数据按照 `category` 列分组,并对每个类别的 `amount` 进行和,从而得到每个类别的总销售额。 #### 示例 2:按类别分组并计算平均销售额和产品数量 ```sql SELECT category, AVG(amount) AS avg_sales, COUNT(*) AS product_count FROM sales GROUP BY category; ``` 该查询不仅计算了每个类别的平均销售额,还统计了每个类别的产品数量。 #### 示例 3:结合 `HAVING` 子句过滤分组结果 如果只想显示总销售额大于 1000 的类别,可以使用 `HAVING` 子句: ```sql SELECT category, SUM(amount) AS total_sales FROM sales GROUP BY category HAVING total_sales > 1000; ``` `HAVING` 子句用于对分组后的结果进行过滤,与 `WHERE` 子句不同,它作用于聚合后的数据。 ### 注意事项 1. **非聚合列必须出现在 `GROUP BY` 子句中** 如果查询中选择了某个列(如 `category`),并且该列没有被聚合函数处理,则该列必须出现在 `GROUP BY` 子句中。 2. **`GROUP BY` 与 `ORDER BY` 结合使用** 可以使用 `ORDER BY` 对分组结果进行排序,以增强可读性。 3. **避免非法使用聚合函数** 聚合函数只能在 `SELECT` 子句和 `HAVING` 子句中使用,不能在 `WHERE` 子句中直接使用。 ### 总结 简单的数据分组查询主要依赖于 `GROUP BY` 子句和聚合函数的结合使用。通过合理设计查询语句,可以有效地对数据进行分类汇总和统计分析,适用于各种业务场景下的数据处理需
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值