题意:

机器人的容器

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 机器人的容器的更多相关文章

  1. 远见而明察近观若明火|Centos7.6环境基于Prometheus和Grafana结合钉钉机器人打造全时监控(预警)Docker容器服务系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_181 我们知道,奉行长期主义的网络公司,势必应在软件开发流程管理体系上具备规范意识,即代码提交有CR(CodeReview),功能 ...

  2. 使用three.js实现机器人手臂的运动效果

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...

  3. Kubernetes 笔记 10 Job 机器人加工厂

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  4. python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)

    昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...

  5. 【容器魔方解读】AWS Re:Invent 2018大会

    每年云计算领域技术与商业风向标之一的AWS Re:Invent大会上周在美国拉斯维加斯召开,如往届一样,AWS密集发布了上百项的新产品或新技术.随着国内近两年云计算尤其是公有云的普及度越来越高,国内各 ...

  6. 使用C# 开始第一个QQ机器人

    本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...

  7. QQ 聊天机器人小薇 2.1.0 发布!

    本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...

  8. 监控生产线上服务器的docker容器及主机

    1. 部署cadvisor容器,用来收集host上的容器信息,该容器部署在需要收集容器信息的每一个主机上部署: docker run -v  /:/rootfs:ro -v /var/run:/var ...

  9. 图灵机器人,web录音实现自动化交互问答

    一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...

随机推荐

  1. js导出execl 兼容ie Chrome Firefox各种主流浏览器(js export execl)

    第一种导出table布局的表格 1 <html> 2 3 <head> 4 <meta charset="utf-8"> 5 <scrip ...

  2. 使用自定义注解和切面AOP实现Java程序增强

    1.注解介绍 1.1注解的本质 Oracle官方对注解的定义为: Annotations, a form of metadata, provide data about a program that ...

  3. CF533F Encoding 题解

    题目链接CF533F Encoding 提示1:   \(\mathcal O(26^2*n)\) 的算法可通过.常用的几种字符串匹配算法kmp,AC自动机,哈希都可以解决该问题 (后两者可以优化到 ...

  4. MySql多表查询_事务_DCL(资料三)

    今日内容 1. 多表查询 2. 事务 3. DCL 多表查询: * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE ...

  5. JAVA安装第一步JDK

    安装JDK----(一学就会) 一.百度搜索JDK,找到下载的地址 二.下载属于自己电脑的对应版本 三.下载到本地之后,双击安装JDK 四.配置环境变量 我的电脑->右键->属性 环境变量 ...

  6. Nodejs学习笔记(5) 文件上传系统实例

    目录 2018.8.4更新:  MySQL可以存放几乎任何类型的数据(图片.文档.压缩包等),但这不是最好的解决方案,正常情况下都是在数据库中存放文件路径,图片.音乐.视频.压缩包.文档等文件存放在硬 ...

  7. Tomcat搭建配置

    Tomcat是Apache软件基金会( Apache Software Foundation )的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而成.受Java ...

  8. python的迭代

    迭代 1:并行迭代 程序可以同时迭代两个序列 names["zhangsan","lisi","zhaosi"] age[12,13,14] ...

  9. Linux 自定义快捷命令

    Linux中一些比较常用的命令总是重复敲很麻烦,这个时候就可以使用 alias 来自定义快捷命令,用以简化操作.系统会有一些预定义的快捷命令,比如 ll 的效果就和 ls -l 一样. 可以使用 al ...

  10. 有必要了解的大数据知识(二) Hadoop

    前言 接上文,复习整理大数据相关知识点,这章节从MapReduce开始... MapReduce介绍 MapReduce思想在生活中处处可见.或多或少都曾接触过这种思想.MapReduce的思想核心是 ...