ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 105 七夕祭

2022-07-02 19:00:53  阅读:194  来源: 互联网

标签:int 交换 红圈 摊位 变更 105 糖果 七夕 AcWing


题目传送门

一、核心问题分析

我的解法涉及一个贪心模板 ,请先看透这个题 :糖果传递

首先提醒一下,在一行中,各列摊位之间交换位置,是不改变行的摊位数量的。列同理。
我们模拟一下交换的过程:

假设七夕祭有\(12\)个摊位,图中有红圈的是题目主角喜欢的摊位。

​ 经过两轮交换后各列的摊位的红圈的数量都一样了,但各行的红圈数量没有发生过变化。

这个题和 糖果传递 那个题有什么关联呢?

别急,我先把这个图改一改(把线擦去了)。

你们看,这些红圈像不像糖果,哈哈哈哈哈哈哈哈,相邻列之间交换摊位,就像是相邻两个小朋友正交换糖果嘛。

算法思路:
因为行之间的交换苹果,并不影响列;列之间交换苹果,并不影响行,现在我们想求的是

\[\large min(行变更次数+列变更次数) \]

而行变更与列变更是个自独立的,我们就可以先计算行变更最小值,再计算列变更最小值,加在一起就是答案。

二、实现代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N = 100010;

int row[N], col[N], s[N], c[N];

LL work(int n, int a[]) {
    //前缀和
    for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];
    //不能整除,最终无法完成平均工作
    if (s[n] % n) return -1;
    //平均数
    int avg = s[n] / n;
    //构建c数组
    c[1] = 0;
    for (int i = 2; i <= n; i++) c[i] = s[i - 1] - (i - 1) * avg;
    //排序,为求中位数做准备
    sort(c + 1, c + n + 1);

    //计算每个c[i]与中位数的差,注意下标从1开始时的写法 c[(n+1)/2]
    LL res = 0;
    for (int i = 1; i <= n; i++) res += abs(c[i] - c[(n + 1) / 2]);

    return res;
}

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

    while (T--) {
        int x, y;
        scanf("%d%d", &x, &y);
        row[x]++, col[y]++;
    }

    LL r = work(n, row);
    LL c = work(m, col);

    if (r != -1 && c != -1)
        printf("both %lld\n", r + c);
    else if (r != -1)
        printf("row %lld\n", r);
    else if (c != -1)
        printf("column %lld\n", c);
    else
        printf("impossible\n");

    return 0;
}

标签:int,交换,红圈,摊位,变更,105,糖果,七夕,AcWing
来源: https://www.cnblogs.com/littlehb/p/16438197.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有