L3-018. 森森美图

news/2025/1/31 6:15:14/

一、题目

这里写图片描述这里写图片描述

二、个人理解

Tips:

  • 此题第一个难点就是读懂题目,当时费了挺长时间才知道样例是如何算出的。如下图所示,是其面部轮廓,其分数计算过程为
    score=1+2+2+9+1+2+221+2+921+2+1+1+1+1+121=3+172=27.04 s c o r e = 1 + 2 + 2 + 9 + 1 + ( 2 + 2 ) ∗ ( 2 − 1 ) + ( 2 + 9 ) ∗ ( 2 − 1 ) + 2 + 1 + 1 + 1 + ( 1 + 1 ) ∗ ( 2 − 1 ) = 3 + 17 ∗ 2 = 27.04
    这里写图片描述
  • 理解题意后就是基本就会了一半了,接下来主要是在A和B的直线的两边分别用BFS求出其最低分数和的曲线,最后相加便能得出结果(注意A和B只能计算一次,所以最后要减去A和B一次)。
  • 除了上述理解外,此题还有几个坑:
    1. 补充说明的第一点(即横轴向右为正,纵轴向下为正),要注意这里表示和程序中数组表示可能不同,要记得转化(如在我的程序中,只要将A和B的x、y相反输入即可);
    2. 因为补充说明的第一点(忽略正好位于连接A和B的直线(注意不是线段)上的像素点)。如何判断三点是否在一个直线上很关键,这里采用三角的行列式公式,即用面积表示,当面积等于0,则其共线;
    3. 还需记住,计算不同部分时,一定要重新初始化。

C++:

#include <iostream>
#include <queue>
#include <cmath>
#include <cstdio>
using namespace std;#define inf 0x11111111;struct Point {int x,y;double dis;//重载bool operator !=(const Point &c) const {return x!=c.x||y!=c.y;}
};
queue<Point> q;
int n,m;
double fdis[105][105];//记录从开始点到每个点的最小值
double score[105][105];//接收题目中各点的分数
Point A,B;//起点和终点
int xa,ya,xb,yb;//边界
int dir1[][2]= {{0,1},{1,0},{-1,0},{0,-1}}; //上下左右的方向
int dir2[][2]= {{-1,-1},{1,-1},{-1,1},{1,1}}; //斜的方向
bool tag;//tag=1表示上半部分,tag=0表示下半部分//三角形行列式公式
int cross(Point a,Point b,Point p)
{return (b.x-a.x)*(p.y-a.y)-(p.x-a.x)*(b.y-a.y);
}void inque(Point p)
{//有效值判断if(p.x<1||p.x>n||p.y<1||p.y>m) {return ;}//当有最小值更新,否则returnif(p.dis>=fdis[p.x][p.y]) {return ;}if(tag) {//上半部分,但是包含起点和终点if(p!=A&&p!=B&&cross(A,B,p)<=0) {return ;}} else {//上半部分,但是包含起点和终点if(p!=A&&p!=B&&cross(A,B,p)>=0) {return ;}}fdis[p.x][p.y]=p.dis;//更新//到终点时,就不继续将其入队if(p.x==B.x&&p.y==B.y) {return;}q.push(p);
}void bfs()
{//清空队列while(!q.empty()) {q.pop();}//初始化for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {fdis[i][j]=inf;}}inque(A);while(!q.empty()) {Point now=q.front();q.pop();Point next;//计算上下左右方向for(int i=0; i<4; i++) {next.x=now.x+dir1[i][0];next.y=now.y+dir1[i][1];next.dis=fdis[now.x][now.y]+score[next.x][next.y];inque(next);}//计算斜方向for(int i=0; i<4; i++) {next.x=now.x+dir2[i][0];next.y=now.y+dir2[i][1];next.dis=fdis[now.x][now.y]+score[next.x][next.y]+(score[next.x][next.y]+score[now.x][now.y])*(sqrt(2)-1);inque(next);}}
}
int main()
{cin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>score[i][j];fdis[i][j]=inf;}}cin>>A.y>>A.x>>B.y>>B.x;A.x++;A.y++;B.x++;B.y++;//因为每从0开始,所以都加1,并且对其表示进行了转化A.dis=score[A.x][A.y];double ans=0;tag=false;bfs();ans+=fdis[B.x][B.y];//上半部分tag=true;bfs();ans+=fdis[B.x][B.y];//下半部分printf("%.2f\n",ans-score[A.x][A.y]-score[B.x][B.y]);//最后再减去重复的起点和终点
}

http://www.ppmy.cn/news/451732.html

相关文章

es7深入搜索

基于词项和基与全⽂的搜索 查询方式&#xff0c;包括&#xff1a;复合查询/全文本查询/term-level查询等 什么场景下用 boolen查询&#xff0c;什么场景下用match查询&#xff0c;又是什么场景下用term查询。 你可以自己对查询去做一些分类。 例如terms查询是用于结构化数据的查…

【ES】Elasticsearch-深入理解索引原理

文章目录 Elasticsearch-深入理解索引原理读操作更新操作 SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并 近实时搜索&#xff0c;段数据刷新&#xff0c;数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间 Elasticsearch-深入…

elasticsearch杀手神器,让es操作更简单

原创 spring设计 [spring设计](javascript:void(0)&#x1f609; 2022-10-09 16:39 发表于云南 文章目录 easy-es介绍简介框架架构适用场景 快速开始废话不多说 直接上代码引入依赖创建es实体模型设计(此处以订单检索为例)创建esMapper类(GoodsSpuEsMapper)service方法实现请求…

二、7less

Less 文章目录 Less注释运算嵌套变量导入less文件导出css文件 less 一个 css 预处理器 作用&#xff1a; 更简单的完成 css扩充 css 语言&#xff0c;具备逻辑性&#xff0c;计算能力浏览器不识别 Less 代码 用途&#xff1a; 保存 less 文件自动生成 css 文件less 运算写法…

使用java来创建es索引(基于es7.8)

1、先引入pom依赖&#xff1a; <dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> …

ElasticSearch浅谈(基于ES 7)

ElasticSearch浅谈 简介 ElasticSearch&#xff0c;简称为ES&#xff0c;是一个开源的高可用&#xff0c;高可扩展的分布式全文搜索引擎&#xff0c;可以视为全文搜索数据库。它可以实现近实时的存储和检索。可以相对方便的扩展到多台服务器上&#xff0c;实现集群的搭建&…

美团外卖搜索基于Elasticsearch的优化实践

美团外卖搜索工程团队在Elasticsearch的优化实践中&#xff0c;基于Location-Based Service&#xff08;LBS&#xff09;业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-Length Encoding&#xff08;RLE&#xff09;设计了一款高效的倒排索引结构&#xff0c;使检索…

SANCUS

又发现一个新框架 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;在社交媒体、电子商务、知识图谱、推荐系统、生命科学等领域得到了广泛应用。随着图数据规模的快速增长&#xff0c;亟需发展分布式大规模图神经网络高效训练技术。现有的方法主要采用中心化的参数服…