七夕祭(贪心+中位数)

传送门

思路

因为交换同一列的相邻两行,这一列的总数不变;交换同一行的相邻两列,这一行的总数不变。
那么如果可以平均分配的话,可以先将所有行都分配好,然后再将所有列分配好。
这样就变成了做两次环形纸牌分配问题,
给一个数列,最后一位和第一位相邻,问能否平均分配,最少需要传递多少次。

首先考虑普通纸牌均分问题:

有 \(n\) 个人坐成一排,每个人 \(a[i]\) 张牌,每个人只能和旁边的人交换纸牌,问最好交换几次能使所有人的手牌数相等。
这是一个经典问题,答案等于 \(\sum_{i=1}^n|s[i]-\frac{t}{n}\cdot i|\),其中 \(s[i]=\sum_{j=1}^ia[i],t=sum[n]\)。
这个结论是很好证明的,前 \(i\) 个人现在有的牌总共为 \(s[i]\) 张,而他们最终的状态是总共 \(\frac{t}{n}\cdot i\) 张,所以他们需要通过第 \(i\) 个人向第 \(i+1\) 个人给出或者索取 \(|s[i]-\frac{t}{n}\cdot i|\) 张牌。

环形纸牌均分问题:

刚刚是 \(n\) 个人做成一行,现在是 \(n\) 个人做成一圈,第 \(1\) 个人和第 \(n\) 个人也可以交换纸牌了,问题相同。
不管怎么说,它总有一个起点,一个终点,我们现在只是不清楚怎样选取起点终点可以使得答案更小而已,不妨先设将第 \(k+1\) 个人设为起点,第 \(k\) 个人设为终点。
设 \(A[i]=a[i]-\frac{t}{n}\),\(S[i]=\sum_{j=1}^iA[i]\),从第 \(k\) 个人断开看成一行。列出现在的排列和前缀和:
\[
\\A[k+1]\quad S[k+1]-S[k]
\\A[k+2]\quad S[k+2]-S[k]
\\ \cdot
\\A[n]\quad S[n]-S[k]
\\A[1]\quad S[1]+S[n]-S[k]
\\A[2]\quad S[2]+S[n]-S[k]
\\ \cdot
\\A[k]\quad S[k]+S[n]-S[k]
\]
因为 \(S[i]=\sum_{j=1}^iA[i]\),所以 \(S[n]=0\),那么可以发现对于不同的 \(k\),答案是 \(\sum_{i=1}^n|S[i]-S[k]|\),这个式子又涉及到了一个经典问题。

货舱选址

x 轴上有 \(n\) 个厂房,给出每个的地址 \(a[i]\),要求选一个厂房地址建货舱使所有厂房到这里的路程总和最小。
答案也是很简单的,是 \(a\) 数列的中位数,证明:设在最优位置仓库左边有 \(q\) 个仓库,总距离 \(Q\),右边有 \(p\) 个仓库,总距离 \(P\),则满足以下关系:
\[
\\Q+P\le Q-q*disl+P+(p+1)*disl\Rightarrow p-q+1\geq 0
\\Q+P\le Q+(q+1)*disr+P-p*disr\Rightarrow q-p+1\geq 0
\\ \Downarrow
\\|p-q|\le 1
\]

回到环性纸牌均分问题

\(\sum_{i=1}^n|S[i]-S[k]|\) 的最小值就是 \(S[k]\) 取 \(S\) 的中位数时

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e5+10;
int n,m,t;
LL r[MAXN],c[MAXN];

LL calc(LL *a,int n){
    for(int i=1;i<=n;i++) a[i]-=t/n;
    for(int i=1;i<=n;i++) a[i]+=a[i-1];
    sort(a+1,a+n+1);
    LL ans=0;
    for(int i=1;i<=n;i++) ans+=abs(a[i]-a[n/2+1]);
    return ans;
}

int main(){
    scanf("%d%d%d",&n,&m,&t);
    for(int i=1,x,y;i<=t;i++){
        scanf("%d%d",&x,&y);
        r[x]++;c[y]++;
    }
    if(t%n==0&&t%m==0) printf("both %lld\n",calc(r,n)+calc(c,m));
    else if(t%n==0) printf("row %lld\n",calc(r,n));
    else if(t%m==0) printf("column %lld\n",calc(c,m));
    else printf("impossible\n");
    return 0;
}

原文地址:https://www.cnblogs.com/BakaCirno/p/12260657.html

时间: 2024-10-03 21:34:13

七夕祭(贪心+中位数)的相关文章

CODEVS 2485 七夕祭 - 贪心+中位数【环形均分纸牌问题】

CODEVS 2485 七夕祭 Sol: 当行的平均值不为整数时,不能均分,列同理. 对行和列分别做一次环形均分纸牌问题. AC CODE: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 100000 + 100; int read(){ int x=0,f=1;char ch=' '; while(ch>'9'||ch<'0

[Poetize II]七夕祭

描述 Description TYVJ七夕祭和11区的夏祭的形式很像.矩 形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋……什么的. Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多.    不 过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点.两个摊点相邻,当且仅

基本算法- 七夕祭

题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊

AcWing 105.七夕祭

题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11区的夏祭的形式很像. 矩形的祭典会场由N排M列共计N×M个摊点组成. 虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的. Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl

:七夕祭 (货仓选址+均分纸牌)

问题 : 七夕祭 时间限制: 1 Sec  内存限制: 128 MB 题目描述 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子.于是TYVJ今年举办了一次线下七夕祭.Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地

bzoj3032 七夕祭题解

题面 TYVJ七夕祭和11区的夏祭的形式很像.矩形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的.Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多. 不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点.两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置

[bzoj3032][TYVJ P1924]七夕祭(环形均分纸牌,货仓选址)

题意 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11区的夏祭的形式很像. 矩形的祭典会场由N排M列共计N×M个摊点组成. 虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖.射的屋--什么的. Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴

lightoj 1349 - Aladdin and the Optimal Invitation 贪心 中位数

1349 - Aladdin and the Optimal Invitation PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 MB Finally Aladdin reached home, with the great magical lamp. He was happier than ever. As he was a nice boy, he wanted to share the hap

P2512 [HAOI2008]糖果传递 - 贪心+中位数【环形均分纸牌问题】

P2512 [HAOI2008]糖果传递 Sol: 环形均分纸牌问题 考虑最基本的均分纸牌问题,相当于将环从1与n之间断开. 令\(res_i\)表示第\(i\)个人达到平均值所用步数,ave$表示糖果的平均数. 则 \(res_1=a_1-ave\) \(res_2=a_2-ave+res_1=a_1+a_2+2*ave\) \(res_3=a_3-ave+res_2=a_1+a_2+a_3-3*ave\) \(\dots\) \(res_i=a_i-ave+res_{i-1}=\sum_{j