【七夕祭】
链接:https://ac.nowcoder.com/acm/contest/1001/C
来源:牛客网
背景
七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是TYVJ今年举办了一次线下七夕祭。Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩。
描述
TYVJ七夕祭和11区的夏祭的形式很像。矩形的祭典会场由N排M列共计N×M个摊点组成。虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。
不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在Vani想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int N=1E5+100;
int n,m,t,c[N],r[N],s[N];
long long solve(int c[],int n) {
memset(s,0,sizeof(s));
for(int i=1; i<=n; i++)
s[i]=s[i-1]+c[i]-t/n;
sort(s+1,s+1+n);
long long sum=0;
int k=(n+1)/2;
for(int i=1; i<=n; i++)
sum+=abs(s[i]-s[k]);
return sum;
}
int main() {
cin>>n>>m>>t;
int a,b;
for(int i=0; i<t; i++) {
cin>>a>>b;
c[a]++;
r[b]++;
}
if(t%m&&t%n) {
puts(“impossible”);
return 0;
}
if(t%n0&&t%m0) {
cout<<"both "<<solve(c,n)+solve(r,m)<<endl;
} else if(t%n==0)cout<<"row "<<solve(c,n)<<endl;
else cout<<"column "<<solve(r,m)<<endl;
return 0;
}
【矩阵行和列】
row表示行,column表示列。
【memset函数的用法】
memset的正规用法是只能用来初始化char类型的数组的,也就是说,它只接受0x00-0xFF的赋值
【感悟】
如果t满足n,m的最小公因数的倍数,说明行和列的要求都满足。t若只是n或m的倍数,说明只满足行或列的要求。最后就是t不是n或m的倍数,则说明行和列的要求都不满足。