《算法竞赛·快冲300题》每日一题:“最大团”

news2024/11/16 2:51:57

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

文章目录

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

最大团” ,链接: http://oj.ecustacm.cn/problem.php?id=1762

题目描述

【题目描述】 数轴上有n个点,第i个点的坐标为xi,权值为wi。两个点i,j之间存在一条边当且仅当abs(xi-xj)>=wi+wj。
你需要求出这张图的最大团的点数。
团:两两之间存在边的定点集合。
【输入格式】 输入第一行为n(n≤200000)
接下来n行,每行两个整数xi、wi。(0≤|xi|,wi≤10^9)
【输出格式】 输出一行一个整数,表示最大团的点数。
【输入样例】

4
2 3
3 1
6 1
0 2

【输出样例】

3

题解

   最大团是一个图论问题:在一个无向图中找出一个点数最多的完全子图。所谓完全图,就是图中所有的点之间都有边。n个点互相连接,共有n(n-1)/2条边。
   普通图上的最大团问题是NP问题,计算复杂度是指数级的。例如常见的Bron-Kerbosch算法,是一个暴力搜索算法,复杂度 O ( 3 n / 3 ) O(3^{n/3)} O(3n/3)。所以如果出最大团的题目,一般不会在普通图上求最大团,而是在一些特殊的图上,用巧妙的、非指数复杂度的算法求最大团。本题n≤200000,只能用复杂度小于O(nlogn)的巧妙算法。
   本题的图比较特殊,所有点都在直线上。在样例中,存在的边有(0-3)、(0-6)、(2-6)、(3-6),其中{0, 3, 6}这3点之间都有边,它们构成了一个最大团。
   另外,本题对边的定义也很奇怪:“两个点i, j之间存在一条边当且仅当abs(xi-xj)≥wi+wj”。
考虑以下2个问题:
   (1)哪些点之间有边?题目的定义是abs(xi-xj)≥wi+wj,若事先把x排了序,设xj≥xi,移位得xj-wj≥xi+wi。这样就把每个点的x和w统一起来了,方便计算。
   (2)哪些点构成了团?是最大团吗?考察3个点x1≤x2≤x3,若x1和x2有边,则应有x1+w1≤x2-w2;若x2和x3有边,则x2+w2≤x3-w3。推导x1和x3的关系:x1+w1≤x2-w2≤x2+w2≤x3-w3,即x1+w1≤x3-w3,说明x1和x3也有边。x1、x2、x3这3点之间都有边,它们构成了一个团。依次这样操作,得符合条件的x1、x2、x3、…,构成了一个大的团。但是,用这个方法得到团是最大的吗?
   为了方便思考,把上述讨论画成图。
在这里插入图片描述

   把每个点的信息画成线段,左端点是x-w,右端点是x+w。问题建模为:在n个线段中,找出最多的线段,使得它们互相不交叉。
   如果学过贪心,发现它就是“活动安排问题(参考《算法竞赛入门到进阶》 100页,活动安排问题)”,或者“区间调度问题”,即在n个活动中,安排尽量多的活动,使得互相不冲突。贪心解法是:
   (1)按活动的结束时间排序。本题按x+w排序。
   (2)选择第一个结束的活动,跳过与它时间冲突的活动。
   (3)重复(2),直到活动为空。每次选择剩下活动中最早结束的活动,并跳过与它冲突的活动。
【重点】 贪心的建模 。

C++代码

   代码的计算复杂度,排序O(nlogn),贪心O(n),总复杂度O(nlogn)。

#include<bits/stdc++.h>
using namespace std;
const int N = 200005;
struct aa{ int l, r; } a[N];
bool cmp(const aa &a,const aa &b){ return a.r<b.r;}  //比较右端点
int main(){
    int n; scanf("%d",&n);
    for (int i=1;i<=n;i++){
        int x,w; scanf("%d%d",&x,&w);
        a[i].l = x-w,
        a[i].r = x+w;
    }
    sort(a+1,a+n+1,cmp);       //按右端点排序
    int R=a[1].r,  ans=1;
    for (int i=2;i<=n;i++)     //选剩下活动中最早结束的活动,跳过冲突的活动
        if (a[i].l>=R){
            R = a[i].r;
            ans++;
        }
    printf("%d",ans);
    return 0;
}

Java代码

import java.util.*;

class Main {
    static class aa { int l, r; }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        aa[] a = new aa[n + 1];
        for (int i = 1; i <= n; i++) {
            int x = sc.nextInt();
            int w = sc.nextInt();
            a[i] = new aa();
            a[i].l = x - w;
            a[i].r = x + w;
        }
        Arrays.sort(a, 1, n + 1, new Comparator<aa>() {
            public int compare(aa a, aa b) { return a.r - b.r;  }
        });
        int R = a[1].r;
        int ans = 1;
        for (int i = 2; i <= n; i++) {
            if (a[i].l >= R) {
                R = a[i].r;
                ans++;
            }
        }
        System.out.println(ans);
    }
}

Python代码

n = int(input())
a = []
for i in range(n):
    x, w = map(int, input().split())
    a.append({'l': x-w, 'r': x+w})
a.sort(key=lambda x: x['r'])
R, ans = a[0]['r'], 1
for i in range(1, n):
    if a[i]['l'] >= R:
        R = a[i]['r']
        ans += 1
print(ans)

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

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

相关文章

zookeeperAPI操作与写数据原理

要执行API操作需要在idea中创建maven项目 &#xff08;改成自己的阿里仓库&#xff09;导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖&#xff1a; 创建日志文件&#xff1a; 创建API客户端&#xff1a; &#xff08;1&#xff09…

Java实现八皇后问题

八皇后问题说明 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都不…

【数据库】Redis可以替代Mysql吗

Redis和Mysql的搭配 Redis可以替代Mysql吗什么是RedisRedis适用的场景以及优点Redis的缺点 什么是MysqlMysql的优点Mysql缺点 总结 Redis可以替代Mysql吗 Redis不能代替MySQL&#xff0c; Redis和MySQL只能是一种互补。 什么是Redis Redis是一种非关系型数据库&#xff0c;也…

IDEA全局设置MyBatis中写SQL语句提示

把这两个设置改成MySQL即可&#xff1a;

clickhouse 删除操作

OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景&#xff0c;市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好&#xff0c;当然 clickhouse 也不例外。但是不友好不代表不支持&#xff0c;本文主要介绍在 clickhouse 中如何实现数据的删除&#xff0c…

获取Spring中bean工具类

获取Spring中bean工具类 工具类 package com.geekmice.springbootselfexercise.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org…

【分布式系统】聊聊流量和数据调度

对于分布式系统来说&#xff0c;除了监控层面、以及服务治理层面&#xff0c;还有两个层面流量和数据调度。流量调度其实比较好理解&#xff0c;就是用户请求的流量&#xff0c;如何按照一定的策略算法打到不同的机器上。以及如何实现一个高可用、高性能的流量调度平台。而数据…

《CUDA C++ Programming Guide》第二章 CUDA 编程模型概述

2.1 内核 CUDA C 通过允许程序员定义称为kernel的 C 函数来扩展 C&#xff0c;当调用内核时&#xff0c;由 N 个不同的 CUDA 线程并行执行 N 次&#xff0c;而不是像常规 C 函数那样只执行一次。 使用 __global__ 声明说明符定义内核&#xff0c;并使用新的 <<<...&g…

CTF PWN之精确覆盖变量数据

刚开始接触pwn的朋友在做pwn练习时可能会有这样的疑问&#xff0c;怎么做到精确覆盖变量数据呢&#xff1f; 我们做pwn练习之前需要先知道&#xff1a;命令行参数C语言的main函数拥有两个参数&#xff0c;为int类型的argc参数&#xff0c;以及char**类型argv参数。其中argc参数…

进入现代云技术的世界-APIGateway、ServiceMesh、OpenStack、异步化框架、云原生框架、命令式API与声明式API

目录 APIGateway Service Mesh OpenStack 异步化框架 云原生框架 命令式API与声明式API APIGateway API网关&#xff08;API Gateway&#xff09;是一个服务器——充当了客户端和内部服务之间的中间层。API网关负责处理API请求&#xff0c;将客户端的请求路由到相应的后端…

centos8.5本地yum源报错

在下载文件出现以下错误 [rootserver ~]# yum install gcc Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. RHEL8.5-BaseOS …

上海亚商投顾:沪指录得4连阴 N盟固利盘中最高涨近37倍

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日延续调整走势&#xff0c;科创50指数跌超1%&#xff0c;创业板指则较为抗跌。医药医疗股集体爆发&#xf…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

前端先行模拟接口(mock+expres+json)

目录 mock模拟数据&#xff1a;data/static.js 路由&#xff1a;index.js 服务器&#xff1a;server.js yarn /node 启动服务器&#xff1a;yarn start 客户端&#xff1a;修改代理路径(修改设置后都要重启才生效) 示例 后端框架express构建服务器 前端发起请求 静态数…

Power BI中实现购物篮分析详解

一、购物篮分析简介 相信&#xff0c;很多人都听过沃尔玛购物篮分析的故事---“啤酒和尿布湿“&#xff0c;即分析购买尿布湿的顾客最喜欢购买的商品是什么&#xff1f;&#xff08;啤酒&#xff09;。在零售终端经营中&#xff0c;通过购物篮分析&#xff0c;分析不同商品之间…

Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#…

数据挖掘全流程解析

数据挖掘全流程解析 数据指标选择 在这一阶段&#xff0c;使用直方图和柱状图的方式对数据进行分析&#xff0c;观察什么数据属性对于因变量会产生更加明显的结果。 如何绘制直方图和条形统计图 数据清洗 观察数据是否存在数据缺失或者离群点的情况。 数据异常的两种情况…

每日后端面试5题 第三天

1. 线程有哪几种状态以及各种状态之间的转换&#xff1f;(必会) 看图&#xff1a; 图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客 图片来自 总算把线程六种状态的转换说清楚了&#xff01; - 知乎 线程一共有4种状态&#xff0c;分别是&#xff1a; 1.…

js手写贪吃蛇游戏

前端手写贪吃蛇游戏 贪吃蛇游戏 场景 使用了js 和 html /css 就可以完成 一个贪吃蛇小游戏 技术分析 主要用到的几个技术点&#xff1a; clientWidth &#xff1a;元素的宽度&#xff0c;包含内边距clientHeight &#xff1a;元素的高度&#xff0c;包含内边距setInterval&am…