hdu2235 机器人的容器
题意:
机器人的容器
Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 171 Accepted Submission(s): 33
Problem Description
这是一个n*m的矩形,矩形的每一个单位格子上的高度为h(0<=h<1000),请问这个容器容量
Input
输入一个正整数T表示有T组数据
对于每组数据第一行输入两个正整数n,m(0<n,m<500)表示矩阵的大小。
接下来有n行,每行m个整数h。
Output
对于每组输入输出一个整数表示容量。
Sample Input
1
4 4
1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1
Sample Output
4
思路:
这个题目做了一个星期,不过感觉是个好题,感觉这个问题很实际,看到好题就特高兴,
说下思路,一开始用了个很tle的方法,把每一个点都就是一层以层的来,对于没一个点的每一层都是处理新图,0,1看能不能跑出去,如果能ans++,时间复杂度大约是 500 * 500 * 1000 * 500 * 500,sb了,后来我想了下用二分去优化每一个点.二分去找每一个点的最大价值,500 * 500 * lg(1000) * 500 * 500照样跪,说下ac的思路吧(网上的,看了好久想了好久才明白), 先把每一个点都独立出来,按高度从小到大排序,如果高相等,就把是最外边上的点放前面,这样二级排序后我们就得到了一个序列,这个序列的最大特点就是任意两个相邻的点之间都没有"空隙",就是没有高度处于之间的柱子,(我表达不太明白,想一下就知道了),然后我们跑循环,我换个方式写,容易明白
for(i = 1 ;i <= n * m ;i ++)
{
如果当前的这个点没有被标记过(标记过的点从此就没有价值了,被标记就是当前可以流出去)
{
如果当前的这个点是边缘上的点
{
那么直接从改点开始搜,吧所有没标记过并且小于等于当前高度的点全都标记上 ,标记的时候别忘了更新 下当前整个图一共已经标记多少个了标记个数很有用..
}
否则
{
如果当前的点的相邻四个点中有被标记过的,那么当前的这个点也就废了,直接从当 前的这个点开始,把小于 等于他并且没标记过的全标记上,标记上的都是废的点..
}
如果当前的高小于下一个高
{
(此时就有一个空隙,那么这个空隙的高度是node[i+1].h - node[i].h,空隙的宽度 是多少呢 ,其实就是当前开 始往前没有作废的点)则 ans += (node[i+1].h - node[i].h) * (i - 作废点的个数,作废点的个数就是全 图被标记 的个数)
}
}
如果没明白我在说下,所谓的作废点就是可以连接到边缘上的点,因为排序了,高度越来越高,如果当前的这个点是作废点,那么当前这个点和他所连接的作废点一定是以后能连接到当前的点的作废点,排序导致没一个相邻的高度差之间不会有别的高度的东西出现.当前的高度差*当前点个数-作废点个数就是当前这一层的价值...这个题目很赞...天天图论,做做这个也挺好..
#include<stdio.h>
#include<string.h>
#include<algorithm> #define N_n 505
#define N_N 250050
using namespace std; typedef struct
{
int x ,y;
int high;
int key;
}NODE; NODE node[N_N];
int H[N_n][N_n];
int mark[N_n][N_n];
int now_mksum;
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
int n ,m; bool camp(NODE a ,NODE b)
{
return a.high < b.high || a.high == b.high && a.key > b.key;
} bool ok(int x ,int y ,int now_h)
{
if(x >= 1 && x <= n && y >= 1 && y <= m && !mark[x][y] && H[x][y] <= now_h)
return 1;
return 0;
} void MK(int x ,int y ,int now_h)
{
for(int i = 0 ;i < 4 ;i ++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(ok(xx ,yy ,now_h))
{
mark[xx][yy] = 1;
now_mksum ++;
MK(xx ,yy ,now_h);
}
}
return;
} void jude(int x ,int y ,int now_h)
{
for(int i = 0 ;i < 4 ;i ++)
{
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if(xx == 0 || xx == n + 1 || yy == 0 || yy == m + 1)
continue;
if(mark[xx][yy])
{
mark[x][y] = 1;
now_mksum ++;
MK(x ,y ,now_h);
break;
}
}
} int main ()
{
int t ,i ,j ,ans;
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&m);
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= m ;j ++)
{
scanf("%d" ,&H[i][j]);
int now = (i - 1) * m + j;
node[now].x = i;
node[now].y = j;
node[now].high = H[i][j];
node[now].key = (i == 1 || i == n || j == 1 || j == m);
}
sort(node + 1 ,node + n * m + 1 ,camp);
memset(mark ,0 ,sizeof(mark));
for(ans = now_mksum = 0 ,i = 1 ;i <= n * m ;i ++)
{
if(node[i].high == node[n*m].high) break;
if(!mark[node[i].x][node[i].y])
{
if(node[i].key)
{
mark[node[i].x][node[i].y] = 1;
now_mksum ++;
MK(node[i].x ,node[i].y ,node[i].high);
}
else jude(node[i].x ,node[i].y ,node[i].high);
}
if(node[i].high < node[i+1].high)
ans += ((node[i+1].high - node[i].high) * (i - now_mksum));
}
printf("%d\n" ,ans);
}
return 0;
}
hdu2235 机器人的容器的更多相关文章
- 远见而明察近观若明火|Centos7.6环境基于Prometheus和Grafana结合钉钉机器人打造全时监控(预警)Docker容器服务系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_181 我们知道,奉行长期主义的网络公司,势必应在软件开发流程管理体系上具备规范意识,即代码提交有CR(CodeReview),功能 ...
- 使用three.js实现机器人手臂的运动效果
Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...
- Kubernetes 笔记 10 Job 机器人加工厂
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...
- python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)
昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...
- 【容器魔方解读】AWS Re:Invent 2018大会
每年云计算领域技术与商业风向标之一的AWS Re:Invent大会上周在美国拉斯维加斯召开,如往届一样,AWS密集发布了上百项的新产品或新技术.随着国内近两年云计算尤其是公有云的普及度越来越高,国内各 ...
- 使用C# 开始第一个QQ机器人
本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...
- QQ 聊天机器人小薇 2.1.0 发布!
本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...
- 监控生产线上服务器的docker容器及主机
1. 部署cadvisor容器,用来收集host上的容器信息,该容器部署在需要收集容器信息的每一个主机上部署: docker run -v /:/rootfs:ro -v /var/run:/var ...
- 图灵机器人,web录音实现自动化交互问答
一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...
随机推荐
- 译文《最常见的10种Java异常问题》
封面:洛小汐 译者:潘潘 知彼知己,方能百战不殆. 前言 本文总结了有关Java异常的十大常见问题. 目录 检查型异常(checked) vs. 非检查型异常(Unchecked) 异常管理的最佳实践 ...
- pytorch(06)autograd与逻辑回归
autograd与逻辑回归 自动求导系统中两个常用的方法: torch.autograd.backward and torch.autograd.grad 演示理解一阶导数.二阶导数的求导过程 理解自 ...
- MySQL日志收集之Filebeat和Logstsh的一键安装配置(ELK架构)
关于ELK是什么.做什么用,我们不在此讨论.本文重点在如何实现快速方便地安装logstash和filebeat组件,特别是在近千台DB Server的环境下(为了安全保守,公司DB Server 目前 ...
- 一款免费的在线 Markdown 笔记,类似 typora 编辑体验
为什么要开发一款新的编辑器 自从我开始使用 Markdown,就爱上了这种标记语法,轻量.纯文本兼容是最大的优点,哪里都可以编辑,一开始是在 IDE 上直接编辑,后来笔记越来越多,需要上传图片,有云同 ...
- C# 应用 - 封装类访问 Oracle 数据库
1. 引入库类 Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; 2. 粗暴封装 namespace xx { p ...
- 开源项目renren-fast开发环境部署(后端部分)
开源项目renren-fast开发环境部署(后端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部署介绍相 ...
- PTE 准备之 Personal introduction
Task strategies Be prepared! This is your opportunity to give the admissions officers a first impres ...
- Java 8 Stream API 详解
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (b ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- 真会C#微信小程序的习题数据JSON文件下载链接
完全没有精力去维护了,所以小程序停掉,集中精力做一件事. 链接: https://pan.baidu.com/s/1xL45KxDzR5oEQM6nwBA5rw 提取码: qv6n