【备战秋招】每日一题:4月23日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

news2024/11/17 1:34:49

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第二题-制作骰子

在线评测链接:P1246

题目内容

塔子哥是一个喜欢手工制作的人,他经常用各种材料制作一些有趣的物品。他最近想要制作一个骰子,但是他不想用普通的六面骰子,他想要制作一个更有挑战性的骰子。他想要制作一个总共有 n 面的骰子,而且每一面的数字也不同于普通的骰子,这 n 面的数字分别是 a_1,a_2,…,a_n

塔子哥知道,要制作一个合法的骰子,必须满足一个条件:所有相对的两面之和都需要相等。比如,如果一个骰子有六个面,分别是 1,2,3,4,2,3 ,那么可以把它摆成这样:上面是 1 ,下面是 4 ,前面是 2 ,后面是 3 ,左边是 2 ,右边是 3 。这样就满足了条件,因为相对的两面之和都是 5 。但是,如果一个骰子有六个面,分别是 1,2,4,5,6,7 ,那么就无法摆成合法的骰子,因为无论怎么摆,都会有相对的两面之和不相等。

塔子哥想要知道,给定 n 和a_1,a_2,...,a_n,能否制作出一个合法的骰子。他会给你总共若干次询问,每次询问他会告诉你 n 和a_1,a_2,...,a_n 的值。你需要帮助塔子哥判断,在每次询问中,他是否能够制作出一个合法的骰子。

特别的,你不需要考虑只有 2 面或者只有 4 面的骰子是如何拼出来的,这方面塔子哥自然会解决,也就是说不需要从几何意义上考虑骰子面数是否满足条件。

输入描述

输入第一行为一个整数 T(1 \leq T \leq 100) ,表述询问数据的组数。

对于每组询问:

输入第一行为一个正整数 n(1 \leq n \leq 100000) ,表示骰子的面数,保证为偶数。

接下来输入一行为 n 个整数,分别为 a_1,a_2,...,a_n(1 \leq a_i \leq 1e6) 。

输出描述

对于每组询问,输出 Yes 或者 No 表示能否拼成骰子

样例1

输入

2
6
1 2 3 4 2 3
6
1 2 4 5 6 7

输出

Yes
No

样例2

输入

4
10
2 3 4 4 3 3 2 1 1 2
20
3 1 3 3 3 4 3 2 1 4 1 1 3 1 1 3 4 4 2 2
18
4 2 1 4 2 3 2 4 2 1 3 4 1 3 2 3 1 3
4
4 2 3 2

输出

Yes
No
Yes
No

思路

简化题意

给定一个长度为 n 的数组,每两个数一组,是否可以使得每组的和都相同?

这里为了方便描述,假设每个数都不一样,且 a_1<a_2<a_3<\cdots<a_n

观察

容易看出来的是: 最小值a_1 和最大值 a_n 必须一组

证明

反证法,如果a_1 不和a_n 一组,则 a_1a_j(1<j<n) 一组,a_k(1<k<n,k\neq j)a_n 一组。首先有 a_k>a_1,再者有 a_n>a_j,故 a_n+a_k>a_1+a_j。此时无论怎么分组,都有至少这两组的和不同。

下一步

这显然成为一个子问题。即a_2a_{n-1} 这 n-2 个数分成两两一组,使得各组之和相同。同样是 a_{2}a_{n-1}必须一组。

故最后的分组为:(a_1,a_n),(a_2,a_{n-1}),\cdots,(a_{n/2},a_{n/2+1})。然后判断各组之和是否都相等即可。

时间复杂度:O(n\log n),排序的复杂度

类似题目推荐

这是比较简单的贪心题。

Leetcode

LeetCode上的贪心题,代码随想录总结的非常好了,见 贪心 - 代码随想录

Codefun2000

美团还是挺喜欢考贪心的,但是大部分是简单贪心吧,如下所示 , 可以过一遍

  1. P1137 美团 2023.04.01-第一题-整理

  2. P1077 美团 2023.3.11-第一题-字符串修改

  3. P1024 百度 2022.9.13-01反转

  4. P1235. 美团 2023.04.15-实习-第一题-字符串前缀

  5. P1089 美团 2023.3.18.10点-第三题-塔子哥的回文串

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
const int N = 100010;
int a[N], n;
void solve() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    sort(a + 1, a + n + 1);
    // 最大最小必须在同一组
    int sum = a[1] + a[n];
    bool ok = true;
    // 子问题,往内收缩,比较
    int l = 2, r = n - 1;
    while (l < r) {
        if (a[l] + a[r] != sum) {
            ok = false;
            break;
        }
        l += 1;
        r -= 1;
    }
​
    puts(ok ? "Yes" : "No");
}
​
int main()
{
    int T = 1;
    scanf("%d", &T);
    while (T--) {
        solve();
    }
​
    return 0;
}

Java

import java.util.Arrays;
import java.util.Scanner;
​
public class Main {
    static final int N = 100010;
    static int[] a = new int[N];
    static int n;
​
    private static Scanner sc = new Scanner(System.in);
​
​
    public static void solve() {
        n = sc.nextInt();
        for (int i = 1; i <= n; ++i) a[i] = sc.nextInt();
        Arrays.sort(a, 1, n + 1);
        // 最大最小必须在同一组
        int sum = a[1] + a[n];
        boolean ok = true;
        int l = 2, r = n - 1;
        // 子问题,往内收缩,比较
        while (l < r) {
            if (a[l] + a[r] != sum) {
                ok = false;
                break;
            }
            l += 1;
            r -= 1;
        }
​
        System.out.println(ok ? "Yes" : "No");
    }
​
    public static void main(String[] args) {
        int T = 1;
        T = sc.nextInt();
        while (T-- > 0) {
            solve();
        }
    }
}

Python

N = 100010
a = [0] * N
n = 0
​
​
def solve():
    global a, n
    n = int(input())
    a = list(map(int, input().split()))
    a.sort()
    # 最大最小必须在同一组
    sum_ = a[0] + a[-1]
    ok = True
    l, r = 1, n - 2
    # 子问题,往内收缩,比较
    while l < r:
        if a[l] + a[r] != sum_:
            ok = False
            break
        l += 1
        r -= 1
​
    print('Yes' if ok else 'No')
​
​
T = int(input())
while T:
    solve()
    T -= 1
​

Go

package main
​
import (
    "fmt"
    "sort"
)
​
var (
    N = 100010
    a = make([]int, N)
    n int
)
​
func solve() {
    nScan, _ := fmt.Scanln(&n)
    if nScan == 0 {
        return
    }
​
    for i := 0; i < n; i++ {
        fmt.Scan(&a[i])
    }
    sort.Ints(a[:n])
​
    // 最大最小必须在同一组
    sum_ := a[0] + a[n-1]
    ok := true
    l, r := 1, n-2
    // 子问题,往内收缩,比较
    for l < r {
        if a[l]+a[r] != sum_ {
            ok = false
            break
        }
        l++
        r--
    }
​
    if ok {
        fmt.Println("Yes")
    } else {
        fmt.Println("No")
    }
}
​
func main() {
    var T int
    fmt.Scanln(&T)
    for T > 0 {
        solve()
        T--
    }
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});

process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    let [T, ...testCases] = lines;

    function solve(a) {
        a.sort((a, b) => a - b);
        const n = a.length;

        // 最大最小必须在同一组
        const sum = a[0] + a[n - 1];
        let ok = true;
        let l = 1, r = n - 2;

        // 子问题,往内收缩,比较
        while (l < r) {
            if (a[l] + a[r] != sum) {
                ok = false;
                break;
            }
            l++;
            r--;
        }

        console.log(ok ? "Yes" : "No");
    }

    for (let i = 0; i < T; i++) {
        const n = Number(testCases[i * 2]);
        const a = testCases[i * 2 + 1].split(" ").map(Number);
        solve(a);
    }
});

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

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

相关文章

Oracle11gRAC安装JVM组件

目录&#xff1a; 安装前检查&#xff1a;安装JVM组件&#xff1a;方式一&#xff08;图形化安装&#xff09;方式二&#xff08;执行脚本安装&#xff09; 检查DB JVM状态脚本 安装前检查&#xff1a; 检查角色&#xff1a; select * from dba_roles where ROLE in (JAVAIDP…

分布式安装配置spark-3.2.3

Spark是一个基于内存的大数据计算框架&#xff0c;可以与Hadoop集成&#xff0c;提供更快速的数据处理能力。本文将介绍如何在三个Ubuntu系统上搭建一个Spark集群。 主要步骤包括&#xff1a; 准备工作&#xff1a;下载安装包&#xff0c;设置环境变量&#xff0c;解压安装包…

基于Elasticsearch与Hbase组合框架的大数据搜索引擎

本项目为学校大数据工程实训项目&#xff0c;共开发4周&#xff0c;答辩成绩不错。代码仓库放文章尾&#xff0c;写的不好&#xff0c;代码仅供参考。 搜索 对于结构化数据&#xff0c;因为它们具有特定的结构&#xff0c;所以我们一般都是可以通过关系型数据库&#xff08;M…

【读书笔记】《房思琪的初恋乐园》- 林奕含

文章目录 第一章 乐园第二章 失乐园 第一章 乐园 钱爷爷说&#xff1a;“两个小美女有心事啊&#xff1f;”怡婷最恨人家叫她们两个小美女&#xff0c;她很这种算术上的好心。 在外人看来&#xff0c;女生无论长得漂亮还是长得不怎么样都是一种原罪。或者正如上野千鹤子所说那样…

pocketgl

pocketgl支持在自己的web页面集成类似 Shadertoy、 Threejs 等基于webGL 的渲染图形窗口&#xff0c; 并且拥有shader代码高亮编辑器支持实时修改和预览。 其自带的mesh包含两个Sphere 和 Teaport, 同时支持上床自定义的网格 和 背景天空盒。其既支持像Shadertoy 这种只包含fra…

[元带你学: eMMC协议详解 13] 数据读(Read) 写(Write) 详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 4700字&#xff0c; 主要内容 1. 数据读取 2. 块读取操作 3. 数据写 4.块写操作 参考 1. 数据读取 当没有数据传输时&#xff0c;DATO-D…

Python使用happybase写入HBase

HBase是一个分布式的、面向列的NoSQL数据库&#xff0c;可以存储大量的非结构化或半结构化的数据。tif是一种常见的影像文件格式&#xff0c;可以存储多波段的栅格数据。本文将介绍如何使用Python的happybase模块和gdal模块&#xff0c;从tif格式的影像文件中读取数据&#xff…

排序算法的奇妙冒险

排序算法的奇妙冒险 一.排序的概念1.1 排序的定义1.2 排序的稳定性1.3 排序的内排序和外排序 二.插入排序2.1 直接插入排序2.2 希尔排序 三.选择排序3.1直接选择排序3.2 堆排序 四.交换排序4.1 冒泡排序4.2 快速排序**选取基准值的方法**快速排序的优化非递归实现快速排序 五.归…

Web3简述MetaMask并演示谷歌安装MetaMask扩展程序方式

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 其实 你如果去找MetaMask 可能会被一些关键字下到 可能会看到 虚假 诈骗等关键字 因为 这个东西本事就是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理资产…

LoadDef python工具包学习一:计算love数

首先在github下载这个工具箱&#xff1a;https://github.com/hrmartens/LoadDef 下载完毕&#xff0c;解压缩进入如下的界面&#xff0c;点击进入working工作文件夹。在doc文件夹里面有帮助文档和教程&#xff0c;有需要的可以仔细阅读。 loaddef主要的功能模块包括&#xff1…

力扣日记1494

1. 题目 [LeetCode 1494. 并行课程 II]https://leetcode.cn/problems/parallel-courses-ii/) 1.1 题意 严格按照选课先修顺序选课&#xff0c;每个学期选课数有上限&#xff0c;求选完所有课程的最短学期数 1.2 分析 这道题的数据量很小&#xff0c;而且作为困难题&#xff…

一起学 WebGL:纹理对象学习

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天我们来了解 WebGL 的纹理对象&#xff08;Texture&#xff09; 纹理对象&#xff0c;是将像素&#xff08;texels&#xff09;以数组方式传给 GPU 的对象&#xff0c;常见场景是贴图&#xff0c;就是将图片的数据应用到 3D 物…

vue 根据word摸板导出word文档,并压缩为zip

yarn add jszip3.10.1 yarn add jszip-utils0.1.0 yarn add pizzip3.1.4 yarn add docxtemplater3.29.5 yarn add docxtemplater-image-module-free1.1.1 yarn add file-saver2.0.5 注意&#xff1a;这里的fileUrl必须是绝对路径&#xff0c;否则可能会报 is not zip的错误&…

当pytest遇上poium会擦出什么火花

当pytest遇上poium会擦出什么火花 首先&#xff0c;创建一个test_sample/test_demo.py 文件&#xff0c;写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来&#xff0c;打开…

(LLM) 的所有知识;10分钟了解向量数据库;微软 Bing 可以识别图片了;

&#x1f989; AI新闻 &#x1f680; 微软 Bing 可以识图」了&#xff0c;吊打 GPT-4&#xff1f; 摘要&#xff1a;微软 Bing 最新识图功能让用户可以上传图片并进行编程、做题、看病等操作&#xff0c;还能分析梗图笑点。然而在某些情况下表现不佳&#xff0c;例如无法数清…

技术分享 | i.MX8M Plus开发板 固定IP地址以及单网口多IP设置

以启扬IMX8MP开发板为例&#xff0c;给大家分享固定IP地址以及单网口多IP设置的步骤流程。 固定IP地址设置 20-wired.network 重启Network生效 网口多ip设置 对于一些网络管理的命令 connman设置&#xff08;参考&#xff09; imx8 yocto系统的init system使用systemd&#xff…

精选Java SSM 框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

STM32 GPIO 详解

0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称&#xff1a;General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;一般用来采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出 1.2 STM32 的 GPIO 特点 不同型号&#xff0…

SpringBatch从入门到实战(五):执行上下文和单步骤重启

一&#xff1a;执行上下文 1.1 Job Context 作业上下文 JobContext 绑定 JobExecution 执行对象&#xff0c;为Job作业执行提供执行环境(上下文)。 1.2 Step Context 步骤上下文 StepContext 绑定 StepExecution 执行对象&#xff0c;为Step步骤执行提供执行环境(上下文)。 …

【剑指offer专项突破版】栈篇——“C“

文章目录 前言一、后缀表达式题目分析思路分析代码 二、小行星碰撞题目分析思路分析代码 三、每日温度题目分析思路分析代码 四、直方图最大矩形面积题目分析思路分析代码 五、矩阵中最大的矩形题目分析思路分析代码 总结 前言 剑指offer专项突破版&#xff08;力扣官网&#x…