L3-018. 森森美图

2024-01-19 14:18
文章标签 l3 018 森森

本文主要是介绍L3-018. 森森美图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

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

二、个人理解

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]);//最后再减去重复的起点和终点
}

这篇关于L3-018. 森森美图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622682

相关文章

LCR 018

题目:LCR 018 解法:双指针 左指针指向第一个元素,右指针指向最后一个元素。两指针向中间收缩,当遇到不合法字符时跳过直到下一个合法字符 public boolean isPalindrome(String s) {int left = 0, right = s.length() - 1;while (left < right) {while (left < right &&

【Python机器学习】核心数、进程、线程、超线程、L1、L2、L3级缓存

如何知道自己电脑的CPU是几核的,打开任务管理器(同时按下:Esc键、SHIFT键、CTRL键) 然后,点击任务管理器左上角的性能选项,观察右下角中的内核:后面的数字,就是你CPU的核心数,下图中我的是16个核心的。 需要注意的是,下面的逻辑处理器:32 表示支持 32 线程(即超线程技术) 图中的进程:和线程:后面的数字代表什么 在你上传的图片中,“进程:180” 和 “线程:3251”

018 路由器与交换机的虚拟化技术

引言 网络虚拟化技术的不断发展,为现代企业提供了更高的灵活性和资源利用率。通过虚拟化路由器和交换机,企业可以在相同的硬件平台上运行多个虚拟网络实例,减少物理设备的依赖,同时提高网络的可扩展性和管理效率。本篇博文将探讨路由器与交换机的虚拟化技术,并展示华为设备的实际配置示例。 1. 路由器虚拟化的基本概念与应用场景 路由器虚拟化允许在同一物理路由器上创建多个虚拟路由器实例,每个实例具有独立的路

第L3周:机器学习-逻辑回归

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标: 逻辑回归适用于分类问题,主要用于解决二分类或多分类的问题。比如:用户购买某商品的可能性,某病人患有某种疾病的可能性等等;某个物品属于哪个类别等;了解Sigmoid和Softmax的用法 具体实现: (一)环境: 语言环境:Python 3.10 编 译 器: PyCharm *框 架:*scikit

AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集

AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云

[018] Android开发之WebService介绍 .

经常有网友问:“在Android平台如何调用WebService”?经过沟通我发现,甚至有些朋友连什么是WebSerivce都不知道就在问怎么使用,更别说和WebService有关的SOAP、WSDL这类“火星”名词了。所以,我就想 在讲解Android平台如何调用WebSerivce之前,先来介绍下WebService,看看它到底有多神秘。       记得我的硕士论文题目中就包含“Web

OVN L2、L3层功能介绍

参考文献: https://tonydeng.github.io/sdn-handbook/ovs/ovn-internal.html 一、OVN L2 功能包括: L2 switchL2 ACLSupports software-based L2 gatewaysSupports TOR (Top of Rack) based L2 gateways that implement the h

[web-018]python的配置文件解析configParser

1.配置文件config.ini,放在项目任意位置,内容如下: [mongo]host=localhostport=27017 2.python读取配置 #!/usr/bin/env python3#-*- coding:utf-8 -*-import configparserfrom pymongo import MongoClientcf = configparser.Confi

八爪鱼现金流-018,持续打磨

八爪鱼,被动收入,财务自由,现金流,现金流游戏,各银行利率,money,资产负债表,财务自由,资产管理,个人理财,管理个人资产,理财,打造被动收入,躺着赚钱,让钱为我打工

【运维项目经历|018】:Elasticsearch智能数据分析平台项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1:本次项目周期? 问题2:服务部署架构方式及数量和配置? 问题3:项目人员配置? 问题4:Elasticsearch是什么? 问题5:Elasticsearch的主要用途是什么? 问题6:El