当前位置: 首页 > news >正文

【算法】七夕祭

题目 

七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。

于是 TYVJ 今年举办了一次线下七夕祭。

Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ 七夕祭游玩。

TYVJ 七夕祭和 11 区的夏祭的形式很像。

矩形的祭典会场由 N 排 M 列共计 N×M 个摊点组成。

虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。

Vani 预先联系了七夕祭的负责人 zhq,希望能够通过恰当地布置会场,使得各行中 cl 感兴趣的摊点数一样多,并且各列中 cl 感兴趣的摊点数也一样多。

不过 zhq 告诉 Vani,摊点已经随意布置完毕了,如果想满足 cl 的要求,唯一的调整方式就是交换两个相邻的摊点。

两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。

由于 zhq 率领的 TYVJ 开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。

现在 Vani 想知道他的两个要求最多能满足多少个。

在此前提下,至少需要交换多少次摊点。

输入格式

第一行包含三个整数 N 和 M 和 T,T 表示 cl 对多少个摊点感兴趣。

接下来 T 行,每行两个整数 x,y,表示 cl 对处在第 x 行第 y 列的摊点感兴趣。

输出格式

首先输出一个字符串。

如果能满足 Vani 的全部两个要求,输出 both;

如果通过调整只能使得各行中 cl 感兴趣的摊点数一样多,输出 row;

如果只能使各列中 cl 感兴趣的摊点数一样多,输出 column;

如果均不能满足,输出 impossible。

如果输出的字符串不是 impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。

数据范围

1 ≤ N , M ≤ 100000
0 ≤ T ≤ min(N ∗ M,100000)
1 ≤ x ≤ N
1 ≤ y ≤ M

输入样例:

2 3 4
1 3
2 1
2 2
2 3

输出样例:

row 1

思路 

由下图可知,行或列移动次数的最小值为:ans = |x1| + |x2| + |x3| + |x4| + ... + |xn-1| + |xn|

设a = (a1 + a2 + a3 + ... + an) / n 为平均值

a1 - x1 + x2 = a
a2 - x2 + x3 = a
a3 - x3 + x4 = a
......
an-1 - xn-1 + xn = a
an - xn + x1 = a

 由此可以推出

x1 = x1 - 0
x2 = x1 + a - a1
x3 = x2 + a - a2 = (x1 + a - a1) + a - a2 = x1 - a1 - a2 + 2*a
......
xn-1 = x1 - a1 - a2 - .... - an-2 + (n - 2) * a
xn = x1 - a1- a2 - a3 - ... - an-1 + (n - 1) * a

其中令cx

c1 = 0
c2 = a - a1
c3 = 2*a - a1 - a2
......
c(n-1) = (n - 2) * a - a1 - a2 - a3 - ... - an-2
cn = (n - 1) * a - a1 - a2 - a3 - ... an-2 - an-1

 因此原式为

ans = |x1 - c1| + |x1 - c2| + |x1 - c3| + |x1 - c4| + ... + |x1 - c(n-1)| + |x1 - cn|

原问题就被化为一个很经典的仓库选址问题,当x1 为 c1 ~ cn的中间值的时候ans为最小值。 

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int row[N],col[N],s[N],c[N];int 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;// 求出平均值for(int i = 1;i <= n; i ++) c[i] = s[i - 1] - (i - 1) * avg;sort(c + 1,c + n + 1);// 对c数组进行排序int res = 0;for(int i = 1; i <= n ; i ++) res += abs(c[i] - c[(n + 1) / 2]);// 由中位数确定最小值return res;// 返回行或列需要移动的次数
}int32_t main()
{int n,m,cnt;cin >> n >> m >> cnt;// 输入场地大小和cl感兴趣的店铺数目while(cnt --)// 输入cl感兴趣的店铺地址{int x,y;cin >> x >> y;row[x] ++,col[y] ++;}int r = work(n,row);int c = work(m,col);if(r != -1 && c != -1) cout << "both " << r + c;else if(r != -1) cout << "row " << r;else if(c != -1) cout << "column " << c;else cout << "impossible";return 0;
}
难度:困难
时/空限制:1s / 64MB
总通过数:7881
总尝试数:21897
来源:《算法竞赛进阶指南》
算法标签

排序icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E6%8E%92%E5%BA%8F贪心icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E8%B4%AA%E5%BF%83推公式icon-default.png?t=N7T8https://www.acwing.com/problem/search/1/?search_content=%E6%8E%A8%E5%85%AC%E5%BC%8F


题目来自:105. 七夕祭 - AcWing题库

相关文章:

  • What does `$?` do?
  • C# 语法进阶 委托
  • 基于web的电影院购票系统
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • vue项目使用typescript创建抽象类及其使用
  • 全链路压力测试有哪些主要作用
  • 虽然是个去年的旧新闻,但这透露了IBM的新去向
  • docker/华为云cce 部署nacos 2.3.0 集群模式
  • sqlilabs第四十九五十关
  • Laravel 使用rdkafka_laravel详细教程(实操避坑)
  • Google上架:2024年一月政策限制之 AI 生成的内容
  • 【动态规划】【 数学】C++算法:514自由之路
  • [SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类
  • 求幸存数之和 - 华为OD统一考试
  • 建模软件Rhinoceros mac介绍说明
  • php的引用
  • AHK 中 = 和 == 等比较运算符的用法
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS实用技巧
  • Git 使用集
  • HTTP那些事
  • HTTP请求重发
  • IOS评论框不贴底(ios12新bug)
  • Java面向对象及其三大特征
  • Service Worker
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue 配置sass、scss全局变量
  • Yeoman_Bower_Grunt
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 创建一个Struts2项目maven 方式
  • 从零开始在ubuntu上搭建node开发环境
  • 蓝海存储开关机注意事项总结
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端学习笔记之观察者模式
  • 实战|智能家居行业移动应用性能分析
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 我是如何设计 Upload 上传组件的
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • linux 淘宝开源监控工具tsar
  • raise 与 raise ... from 的区别
  • 扩展资源服务器解决oauth2 性能瓶颈
  • # include “ “ 和 # include < >两者的区别
  • #### go map 底层结构 ####
  • #{} 和 ${}区别
  • #在 README.md 中生成项目目录结构
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (vue)页面文件上传获取:action地址
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)fock函数详解
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 简介:跨平台、开源、高性能的开发平台