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 ...
 
随机推荐
- WebService和Web API 区别
			
WebService的特征: 1 基于SOAP协议的,数据格式为XML 2 只支持HTTP协议,只能部署在IIS上 3 不是开源的,但可以被任意一个了解XML的人使用 SOAP :简单对象访问协议Si ...
 - PicGo+Typora+Gitee设置图床
			
PicGo图床 使用 Typora 编辑 MarkDown 非常方便,但是图片插入后只能保存在本地,十分讨厌 所以,可以使用图床技术,将图片先保存到网络端,再应用到 Typora 中 PicGo应用获 ...
 - Java 集合框架 01
			
集合框架· ArrayList 和 Vector 对象数组的概述和使用 * A:案例演示 * 需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取到每个学生的信息 Student[] ...
 - JAVA-标识符、变量、数据类型
			
标识符和关键字  所有的标识符否应该以字母a ~ z和 A ~Z ,美元符($).下划线(_)开始.  首字符之后可以是字母a ~ z和 A ~Z ,美元符($).下划线(_)的任意字符组合. 注 ...
 - 如何自己配置pip源
			
方式一:临时使用国内pypi镜像安装 pip install -i http://pypi.douban.com/simple/ numpy pip install -i http://pypi.do ...
 - 2019 GDUT Rating Contest II : Problem C. Rest Stops
			
题面: C. Rest Stops Input file: standard input Output file: standard output Time limit: 1 second Memory ...
 - Django分页器组建
			
class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): & ...
 - 从RocketMQ的Broker源码层面验证一下这两个点
			
本篇博客会从源码层面,验证在RocketMQ基础概念剖析,并分析一下Producer的底层源码中提到的结论,分别是: Broker在启动时,会将自己注册到所有的NameServer上 Broker在启 ...
 - 谜题(JAVA语言)
			
package 第三章习题; /* * 有一个5*5的网络,其中恰好有一个格子是空的,其他格子各有一个字母. * 一个有4种指令:A, B, L, R, 分别表示把空格上.下.左.右的相邻字母移到 ...
 - CentOS7 搭建 K8S 环境
			
前期准备 环境规划 K8S 与Docker兼容问题 k8s v1.18.0 => Docker v18.x k8s v1.19.0 => Docker v19.x 软件 版本 Linux操 ...