博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 1004 D Sonya and Matrix
阅读量:4331 次
发布时间:2019-06-06

本文共 1437 字,大约阅读时间需要 4 分钟。

cf 1004 D.

题意

给你t个数字,要组成一个\(n*m\)的矩阵,这个矩阵里面的元素等于该点到数字0的曼哈顿距离,问是否能构造出这样的一个矩阵,如果可以,输出数字0所在的左边以及n和m。不能就输出-1.

题解

第一次接触

可以知道,最大值maxn肯定是位于某一个角上,我们假设是(n, m);

假设中心点为(x, y),那么式子maxn = n - x + m - y;

假设元素i的数量少于\(i * 4\) 那么说明有元素i位于了边界外,就是x = i

然后枚举每一个n和m,求出y。(n和m肯定是t的因子

复杂度具高,居然能过

#include 
#include
int c[1000010], cnt[1000010];int t, x, y, maxn = 0;int main() { scanf("%d", &t); for(int i = 1; i <= t; i++) { scanf("%d", &x); c[x]++; if(maxn < x) maxn = x; } x = 0; for(int i = 1; i <= t; i++) { if(c[i] != 4 * i) { x = i; break; } } for(int i = 1; i <= t; i++) { if(t % i == 0) { int n = i, m = t / i; y = n + m - x - maxn; if(abs(n - x) + abs(m - y) != maxn) continue; for(int j = 0; j <= n + m; j++) cnt[j] = 0; for(int j = 1; j <= n; j++) { for(int k = 1; k <= m; k++) { cnt[abs(x - j) + abs(y - k)]++; } } int flag = 0; for(int j = 0; j <= maxn; j++) { if(cnt[j] != c[j]) { flag = 1; break; } } if(flag == 0) { printf("%d %d\n%d %d\n", n, m, x, y); return 0; } } } printf("-1\n"); return 0;}

转载于:https://www.cnblogs.com/fanshhh/p/11371015.html

你可能感兴趣的文章
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
自动测试用工具
查看>>
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
07 js自定义函数
查看>>
jQueru中数据交换格式XML和JSON对比
查看>>
form表单序列化后的数据转json对象
查看>>
[PYTHON]一个简单的单元測试框架
查看>>
iOS开发网络篇—XML数据的解析
查看>>
[BZOJ4303]数列
查看>>