《算法竞赛·快冲300题》每日一题:“ 盲文文字编码”

news2024/11/16 8:29:30

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

盲文文字编码” ,链接: http://oj.ecustacm.cn/problem.php?id=2141

题目描述

【题目描述】 盲文文字编码由一些凸起的点组成。
  如下图所示,我们使用坐标 (0,2),(1,1)表示左侧盲文文字,用坐标(0,1)(1,0)表示右侧盲文文字。
在这里插入图片描述
  注意:左右图可以通过平移得到,因此被认为是统一文字编码。
  现在给你 n 个文字,请判断存在多少个不同的文字。
【输入格式】 输入第一行为正整数 n,表示存在 n 个文字,1≤n≤100000。
  接下来存在 n 部分,每部分第一行为正整数 m ,表示这个文字由 m 个点组成1≤m≤1000。
  接下来m行,每行包含两个整数 x 和 y,-1000≤x,y≤1000。
  输入保证总点数不超过1000000。
【输出格式】 输出一个整数表示答案。
【输入样例】

样例1:
2
2
0 2
1 1
2
0 1
1 0

样例22
3
-1 0
0 1
1 0
3
-1 0
0 -1
1 0

【输出样例】

样例1:
1

样例22

题解

  题意是,如果一个图案中的黑点通过平移能到达另一个图案,那么这两个图案就是一样的。由于只需要平移,不需要旋转,处理比较简单。只需要把所有图案的左下角黑点都平移到原点,即可判断有多少不同的图案。
  图案的左下角平移到原点后,这个图案的其他点也平移到相应的位置。具体操作是把图案的所有坐标排序,找到左下角的点P,平移到原点,其他点的坐标减去P的坐标得到新坐标。把每个图案的所有坐标存到vector中;对所有图案用set判重。

【重点】 set的应用。

C++代码

  代码的复杂度:共n个文字,第14行对每个文字排序是O(mlogm)的,第18行插入到set是O(logn)的,总复杂度O(n(mlogm+logn))。

#include<bits/stdc++.h>
using namespace std;
set<vector<pair<int,int>>>tot;
int main(){
    int n;
    scanf("%d", &n);
    while(n--){
        int m;     scanf("%d", &m);
        vector<pair<int,int> >a;      //用vector存一个图案a
        while(m--){                   //读一个图案的m个点
            int x, y;   scanf("%d%d", &x, &y);
            a.push_back(make_pair(x, y));
        }
        sort(a.begin(), a.end()); //把这个图案的m个点排序,先x从小到大,x相同再y从小到大
        int delta_x = a[0].first, delta_y = a[0].second;
        for(auto & x : a)       //把最左下点移到原点,其他点平移到相应位置
            x.first -= delta_x, x.second -= delta_y;
        tot.insert(a);  //插入到set tot中,判重
    }
    cout<<tot.size()<<endl;
    return 0;
}

Java代码

  在使用Set<List>类型时,确保在添加元素之前先正确实现equals()和hashCode()方法,以避免重复元素被添加到集合中。

import java.util.*;
import java.io.*; 
class Main {
    static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        Set<List<Point>> tot = new HashSet<>();
        int n = Integer.parseInt(input.readLine().trim());
        for (int i = 0; i < n; i++) {
            int m = Integer.parseInt(input.readLine().trim());
            List<Point> a = new ArrayList<>();
            for (int j = 0; j < m; j++) {
                String[] line = input.readLine().trim().split("\\s+");
                int x = Integer.parseInt(line[0]);
                int y = Integer.parseInt(line[1]);
                a.add(new Point(x, y));
            }
            Collections.sort(a, new PointComparator());
            int delta_x = a.get(0).x;
            int delta_y = a.get(0).y;
            for (int j = 0; j < m; j++) {
                a.get(j).x -= delta_x;
                a.get(j).y -= delta_y;
            }
            tot.add(a);
        }
        System.out.println(tot.size());
    } 
    static class PointComparator implements Comparator<Point> {
        public int compare(Point p1, Point p2) {
            if (p1.x != p2.x) return p1.x - p2.x;
            else              return p1.y - p2.y;
        }
    }
 
    static class Point {
        int x, y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        } 
        @Override
        public boolean equals(Object obj) {
            if (this == obj)  return true;            
            if (obj == null || getClass() != obj.getClass()) 
                return false;
            Point point = (Point) obj;
            return x == point.x && y == point.y;
        }
        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    }
}

Python代码

from functools import cmp_to_key
import sys
input = sys.stdin.readline           #加这句后读入会快些
def sort_points(p1, p2):
    if p1[0] != p2[0]:    return p1[0] - p2[0]   #x坐标不等,比较x
    else:                 return p1[1] - p2[1]   #x坐标相等,比较y
tot = set()
n = int(input())
for i in range(n):
    m = int(input())
    a = []
    for j in range(m):
        x, y = map(int, input().split())
        a.append((x, y))
    a.sort(key=cmp_to_key(sort_points))
    delta_x, delta_y = a[0]
    a = [(x - delta_x, y - delta_y) for x, y in a]
    tot.add(tuple(a))
print(len(tot))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/838563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《cuda c编程权威指南》05 - cuda矩阵求和

目录 1. 使用一个二维网格和二维块的矩阵加法 1.1 关键代码 1.2 完整代码 1.3 运行时间 2. 使用一维网格和一维块的矩阵加法 2.1 关键代码 2.2 完整代码 2.3 运行时间 3. 使用二维网格和一维块的矩阵矩阵加法 3.1 关键代码 3.2 完整代码 3.3 运行时间 1. 使用一个二…

==和equals():比较对象等不等?

引言&#xff1a; 在编程中&#xff0c;我们常常需要判断两个对象是否相等。而在Java中&#xff0c;有两种常用的方法&#xff1a;使用""运算符和调用equals()方法。这两个方法有什么区别呢&#xff1f;它们又有哪些有趣的应用呢&#xff1f;让我们一起来探索一下吧&…

RTT学习笔记12-KConfig 语法学习

KConfig 语法学习 RTT 官方教程 https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig 我自己写的IIC配置 menuconfig BSP_USING_I2C # I2C 菜单bool "Enable I2C BUS" # 提示I2C 菜单default n # 默认不使能I2C 菜单…

第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增

文章目录 多源汇最短路&#xff1a;1125. 牛的旅行传递闭包&#xff1a;343. 排序最小环&#xff1a;344. 观光之旅345. 牛站 flody的四个应用&#xff1a; 多源汇最短路传递闭包找最小环恰好经过k条边的最短路 倍增 多源汇最短路&#xff1a;1125. 牛的旅行 1125. 牛的旅行 …

Camera之PhysicalCameraSettingsList/SurfaceMap/CameraMetadata/RequestList的关系(三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

打开的idea项目maven不生效

方法一&#xff1a;CtrlshiftA&#xff08;或者help---->find action&#xff09;&#xff0c; 输入maven&#xff0c; 点击add maven projects&#xff0c;选择本项目中的pom.xml配置文件&#xff0c;等待加载........ 方法二&#xff1a;view->tools windows->mave…

使用Python将Word文档转换为PDF的方法

摘要&#xff1a; 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法。我们将使用python-docx和pywin32库来实现这个功能&#xff0c;这些库提供了与Microsoft Word应用程序的交互能力。 正文&#xff1a; 在现实生活和工作中&#xff0c;我们可能会遇到将Word文…

软考高级架构师——2、操作系统

一、进程管理 • 进程的状态&#xff08;★&#xff09; • 进程的同步与互斥&#xff08;★★★★&#xff09; 临界资源&#xff1a;诸进程间需要互斥方式对其进行共享的资源&#xff0c;如打印机、磁带机等 临界区&#xff1a;每个进程中访问临界资源的那段代码称为临界区…

ubuntu18.04 虚拟机与主机不通,虚拟机无法上网,导致无法git clone代码

问题前置&#xff1a;修改了固定ip。 虚拟机ip&#xff1a; 虚拟机设置NAT模式&#xff1a; 主机配置网络适配器&#xff1a;分配ipv4192.168.152.2保持与虚拟机的虚拟网关192.168.152.0,192.168.152.1在同一网段。虚拟机静态ip为192.168.152.146 虚拟机&#xff0c;网关&#…

【项目 线程4】3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

3.12生产者消费者模型 生产者消费者模型中的对象&#xff1a; 1、生产者 2、消费者 3、容器 若容器已满&#xff0c;生产者阻塞在这&#xff0c;通知消费者去消费&#xff1b;若容器已空&#xff0c;则消费者阻塞&#xff0c;通知生产者去生产。生产者可以有多个&#xff0c;消…

供水管网漏损监测,24小时保障城市供水安全

供水管网作为城市生命线重要组成部分&#xff0c;其安全运行是城市建设和人民生活的基本保障。随着我国社会经济的快速发展和城市化进程的加快&#xff0c;城市供水管网的建设规模日益增长。然而&#xff0c;由于管网老化、外力破坏和不当维护等因素导致的供水管网漏损&#xf…

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本&#xff1a;otp_win64_23.2 rabbitmq-server-3.8.16 版本说明&#xff1a;https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…

8.5作业

要求实现AB进程对话 a.A进程先发送一句话给B进程&#xff0c;B进程接收后打印 b.B进程再回复一句话给A进程&#xff0c;A进程接收后打印 c.重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 A进程 #include<stdio.h> #include<string.h> #include&…

Linux文本三剑客---grep、sed、awk

目录标题 1、grep1.1 命令格式1.2命令功能1.3命令参数1.4grep实战演练 2、sed2.1 认识sed2.2命令格式2.3常用选项options2.4地址定界2.5 编辑命令command2.6用法演示2.6.1常用选项options演示2.6.2地址界定演示2.6.3编辑命令command演示 3、awk3.1认识awk3.2常用命令选项3.3awk…

中国中医中药元宇宙 中药材价格缘何“狂飙”

◇相比去年同期&#xff0c;有超200个常规品种涨幅高于50%&#xff0c;25个常用大宗药材涨幅超200%&#xff0c;个别品种甚至涨价4至9倍 ◇在中药材价格普遍高涨的情况下&#xff0c;部分市场仓库库存数量也较多&#xff0c;出现囤积居奇倾向 ◇“不少游资和热钱涌入中药材市场…

MyBatis查询数据库之一(概念+创建项目+基础交互)

目录 1.MyBatis是什么&#xff1f; 2.为什么学习MyBatis&#xff1f; 3. 怎么学 MyBatis 4.第⼀个MyBatis查询 4.1 添加MyBatis框架支持 4.1.1老项目添加MyBatis 4.1.2 新项目添加MyBatis 4.2 配置连接字符串和MyBatis 4.2.1 配置连接字符串 4.2.2 配置 MyBatis 中的…

小白电脑装机(自用)

几个月前买了配件想自己装电脑&#xff0c;结果最后无法成功点亮&#xff0c;出现的问题是主板上的DebugLED黄灯常亮&#xff0c;即DRAM灯亮。对于微星主板的Debug灯&#xff0c;其含义这篇博文中有说明。 根据另一篇博文&#xff0c;有两种可能。 我这边曾将内存条和主板一块…

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架&#xff0c;将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分&#xff0c;并将可变的行为留给子类来实现。 2.各子类中公共…

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

vue v-slot指令

目录 定义语法使用场景场景一场景二场景三tips只有一个默认插槽时 定义 在Vue中&#xff0c; v-slot 指令用于定义插槽的模板内容。它用于在父组件中传递内容到子组件中的插槽。 v-slot 指令可以用于 标签或组件标签上&#xff0c;以便在子组件中使用插槽。 语法 使用 v-slo…