[JZOJ3382] [NOIP2013模拟] 七夕祭 解题报告
题目大意:给定n*m的图,再给出t个点的坐标。首先分别判断是否可以做到使每行的点数相等和使每列的点数相等,若可以输出达到的最小步数。(如果都可以就把步数加起来)
题解:
我们发现行和列是不互相影响的,因此我们完全可以分开来处理。做过均分纸牌吧,这就是两个环形的均分纸牌。设有 n 堆纸牌,每堆有 ai 张,所有堆一共有 s 张,那么最终每堆应该有 s / n 张。因此如果 s mod n≠0,显然是无解的。于是每堆减去平均数(最终数值),即我们构造数列 bi=ai-s/n。原始的均分纸牌做法是,从开头到结尾扫一遍,每次贪心的从下一个堆把这个堆“少的”填满,统计移动的答案即可。那么这里呢?
1.由于是环形的,很容易想的就是我们枚举开头(其实就是枚举断开环的位置),然后像上面一样扫一遍,时间复杂度 O(n2),预计得分70分
2.设bi的前缀和为sumi.如果从第 k 个位置开始,那么第 i 堆和第 i+1 堆交换的纸牌数就是 |sumi-sumk|(手动模拟即可明白)。总代价就是|sum1-sumk|+|sum2-sumk|+|sum3-sumk|+……+|sumn-sumk|。发现什么了?当sumk是sum1~sumn中位数的时候,上式有最小值!所以把 sumi 排序后,令 sumk=sum[(n+1)/2],计算代价即可。时间复杂度 O(nlogn),预计得分 100 分
我只想说。。。考试的时候我做过这题了
#include<iostream> #include<cstdio> #include<algorithm> #include<math.h> #define ll long long using namespace std; const int maxn=1e5+50; int n,m,t,p1,p2; ll ans; int a[maxn],b[maxn],sum[maxn]; inline int read() { char ch=getchar(); int s=0,f=1; while (!(ch>='0'&&ch<='9')) {if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();} return s*f; } int main() { n=read();m=read();t=read(); for (int i=1;i<=t;i++) { a[read()]++; b[read()]++; } if (t%n) p1=1; if (t%m) p2=1; if (p1&&p2) {puts("impossible");return 0;} if (!p1&&!p2) printf("both "); else if (!p1) printf("row "); else printf("column "); for (int i=1;i<=n;i++) a[i]-=t/n; for (int i=1;i<=m;i++) b[i]-=t/m; if (!p1) { for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; sort(sum+1,sum+1+n); int mm=sum[1+n>>1]; for (int i=1;i<=n;i++) ans+=1ll*abs(mm-sum[i]); } if (!p2) { for (int i=1;i<=m;i++) sum[i]=sum[i-1]+b[i]; sort(sum+1,sum+1+m); int mm=sum[1+m>>1]; for (int i=1;i<=m;i++) ans+=1ll*abs(mm-sum[i]); } printf("%lld",ans); return 0; }
星星之火,终将成燎原之势
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用