题意:

机器人的容器

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. 不用代码趣讲 ZooKeeper 集群

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  2. POJ-1458(LCS:最长公共子序列模板题)

    Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...

  3. python面试题总结

    Python语言特性 1. Python的函数参数传递 ​ 看两个如下例子,分析运行结果 #代码1 a = 1 def fun(a): a = 2 fun(a) print(a) #1 #代码2 a ...

  4. 攻防世界 reverse Guess-the-Number

    Guess-the-Number  su-ctf-quals-2014 使用jd-gui 反编译jar import java.math.BigInteger; public class guess ...

  5. 攻防世界 reverse Newbie_calculations

    Newbie_calculations Hack-you-2014 题目名百度翻译成新手计算,那我猜应该是个实现计算器的题目.... IDA打开程序,发现一长串的函数反复调用,而且程序没有输入,只有输 ...

  6. teprunner测试平台用例前置模块开发

    本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...

  7. 【Azure 应用程序见解】 Application Insights 对App Service的支持问题

    问题描述 Web App 发布后, Application Insights 收集不到数据了 问题分析 在应用服务(App Service)中收集应用的监控数据(如Request,Exception, ...

  8. 设计vue3的请求实体工厂

    设计一个vue3的请求实体工厂 目录 设计一个vue3的请求实体工厂 描述 实现 构建一个基础请求方法 创建具体请求的方法 下面是对请求的声明文件 下面是请求的定义 generateRequest对请 ...

  9. 【odoo14】第二十三章、管理邮件

    邮件集成是odoo最重要的特性.我们可以通过odoo收发邮件.我们甚至可以管理业务文档上的电子邮件,如潜在客户.销售订单和项目.本章,我们将探讨在odoo中处理邮件的方式. 配置邮件服务器 管理文档中 ...

  10. java例题_01 不死神兔!

    1 /*1 [程序 1 不死神兔] 2 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 3 程 ...