【程序设计大赛刷题记录】C语言 03

【七夕祭】
链接: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的倍数,则说明行和列的要求都不满足。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值