【题解】飞镖

题目描述

        小明喜欢玩飞镖游戏,他会把每次的得分都记录在数组中。今天有个飞镖大奖,得奖的规则是:如果你4次飞镖的得分先后是(a,b,c,d),满足a×b×c=d。

        小明准备把记录里的其他项删除,只留下满足获奖条件的4个分数,他想问你有多少种不同方案?

 

输入输出格式

输入格式

        第一行,一个整数N。(N <= 2000)

        第二行,N个整数,每个整数范围在[1...10^6]。

 

输出格式

        一行,一个整数,代表方案数。

 

输入输出样例

输入样例一

6

10 2 2 7 40 160

 

输出样例一

2

 

输入样例二

8

128 64 32 16 8 4 2 1

 

输出样例二

0

 

题解

        暴力枚举a,b,c,求d是否存在,可以做到O(n³)的时间复杂度,但是显然并不能满足这题的数据范围。

        我们可以从另一个角度出发。由题的a*b=d/c,我们可以先枚举a*b,记录b出现的位置,然后枚举d/c,根据c的位置来找满足b的位置符合题意的情况数,这样看起来也是O(n³),但实际上用二分查找优化可以做到O(n²logn),刚好可以通过这题。

#include <iostream>
#include <vector>#define MAX_N 2000
#define PTS 1000000using namespace std;int n;
int a[MAX_N | 1];
vector<int> c[PTS | 1];
long long ans;inline int BS(int x, int p)
{int len = c[x].size();int lt = 0, rt = len - 1, mid;while(lt <= rt){mid = lt + rt >> 1;if(c[x][mid] >= p) rt = mid - 1;else if(mid + 1 < len && c[x][mid + 1] < p) lt = mid + 1;else return mid + 1;}return 0;
}int main()
{cin >> n;for(register int i = 1; i <= n; ++i){cin >> a[i];}for(register int i = 2; i + 2 <= n; ++i){for(register int j = 1; j < i; ++j){if((long long)a[i] * a[j] > PTS) continue;c[a[i] * a[j]].push_back(i);}}for(register int i = 3; i < n; ++i){for(register int j = i + 1; j <= n; ++j){if(a[j] % a[i]) continue;ans += BS(a[j] / a[i], i);// cout << i << " " << j << " " << ans << endl;
        }}cout << ans;return 0;
}
参考程序O(n²logn)版

        然而,当数据范围再放大一些的时候,上面的做法就不行了。我们可以看看上面的做法的缺点,在于需要查找b的位置,如果我们可以在枚举d/c的时候同时枚举a*b,就可以做到O(n²)的时间复杂度,而这真的可以实现,只需要利用b的位置在c的位置前面这个特性即可,具体可以参考下面的程序。(而且这个做法还更好写。。)

#include <iostream>#define MAX_N 2000
#define PTS 1000000using namespace std;int n;
int a[MAX_N | 1];
int c[PTS | 1];
long long ans;int main()
{cin >> n;for(register int i = 1; i <= n; ++i){cin >> a[i];}for(register int i = 3; i < n; ++i){for(register int j = 1; j < i - 1; ++j){if((long long)a[i - 1] * a[j] > PTS) continue;++c[a[i - 1] * a[j]];}for(register int j = i + 1; j <= n; ++j){if(a[j] % a[i]) continue;ans += c[a[j] / a[i]];}}cout << ans;return 0;
}
参考程序O(n²)版

 

 

 

转载于:https://www.cnblogs.com/kcn999/p/10353584.html

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

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

相关文章

OpenCV技巧篇——多目标视觉定位(以飞镖定位为例)

OpenCV技巧篇【1】——多目标视觉定位&#xff08;以飞镖定位为例&#xff09; 1、针对问题 多目标视觉定位是指通过计算机视觉技术对一张图片中的多个目标进行识别和定位的过程。本篇将以对飞镖定位为例&#xff0c;提出一个简单有效的多目标定位技巧&#xff0c;最终实现如…

LeetCode 1453. 圆形靶内的最大飞镖数量(几何题)

1. 题目 墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。 投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。 请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。 示例 1&#xff1a; 输入&#xff1a;points [[-2,0],[2,0…

一个飞镖模型

#飞镖 #一个角 from turtle import* def angle():pu()goto(0,0)pendown()pencolor("black")left(45)fd(50)left(68)fd(91.73)left(157)fd(120)begin_fill()fillcolor("black")right(135)fd(50)right(68)fd(91.73)right(157)fd(120)end_fill()#飞镖复杂化 d…

扔飞镖游戏

日落西山红霞飞~战士打靶把营归呀巴扎嘿。今天我制作一个简单的打靶游戏&#xff08;扔飞镖&#xff09; 在制作之前首先要思考这个游戏需要什么对象&#xff0c;很简单&#xff0c;一只飞镖、一个靶。 这里我把飞镖设置成了刚体&#xff0c;什么是刚体&#xff1f;简而言之&…

2022赛规整理——飞镖

2022赛规整理——飞镖 ​ V1.0 2021.10.23 1、比赛场地 &#xff08;1&#xff09;打击角度及距离 飞镖口——前哨站&#xff1a;左6.5&#xff0c;直线距离15865mm 飞镖口—— 基地 &#xff1a;右7.3&#xff0c;直线距离25233mm &#xff08;2&#xff09;基地示意图 基…

QT之“飞镖盘”自定义控件

QT之“飞镖盘”自定义控件 前言控件预览实现 前言 现在发一个我之前看过有人写了一个抽奖转盘&#xff0c;所以闲来无事写了一个飞镖盘控件&#xff0c;在我看来它其它没有什么实用价值&#xff0c;纯属写来玩玩而已。 控件预览 实现 画背景 void QDartboard::drawBkg(QPai…

在window上配置NASM

NASM是支持x86、x64架构CPU的汇编器(汇编软件)&#xff1b;NASM也支持大量的文件格式&#xff0c;包括Linux&#xff0c;*BSD&#xff0c;a.out&#xff0c;ELF&#xff0c;COFF&#xff0c;Mach−O&#xff0c;Microsoft 16−bit OBJ&#xff0c;Win32以及Win64&#xff0c;同…

pc单机版雷电修改器源码

记得以前第一次接触电脑玩的第一个游戏就是雷电&#xff0c;那时候觉得这游戏真好玩&#xff0c;很过瘾。闲来没事干&#xff0c;所以想重温一下游戏&#xff0c;&#xff08;当时玩的不是这个版本的雷电&#xff09;&#xff0c;那时候是和小伙伴一起玩的&#xff0c;可惜现在…

《愤怒的小鸟》登陆PC 绿色免安装版首发

这群去年风靡手机的小鸟就不用过多的介绍了&#xff0c;一个月前其开发商游戏开发商Rovio表示将会推出PC版。今天为大家带来的就是绿色免安装版的愤怒的小鸟。 游戏的玩法很简单&#xff0c;将弹弓上的小鸟弹出去&#xff0c;砸到绿色的肥猪&#xff0c;将肥猪全部砸到就能过关…

Pygame小游戏之俄罗斯方块凭什么火了30年?(史上最畅销单机游戏)

前言 一款俄罗斯方块火了30年&#xff0c;成为有史以来最畅销的单机游戏。 它为什么有那么的魔力经久不衰? 小编总结了一些原因&#xff1a;上手极其简单&#xff0c;技巧却很多&#xff0c;满足在混乱中创造秩序的渴望…… 工程师阿列克谢说&#xff0c;人们并没有意识到&…

硬盘图标修改器 V1.0 绿色版

软件名称&#xff1a;硬盘图标修改器 V1.0 绿色版软件语言&#xff1a; 简体中文授权方式&#xff1a; 免费软件应用平台&#xff1a; Win7 / Vista / Win2003 / WinXP / Win2008 软件大小&#xff1a; 12.3MB图片预览&#xff1a; 软件简介:是否厌倦了千篇一律的Windows硬盘图…

Java多线程与并发编程

课程地址&#xff1a; https://www.itlaoqi.com/chapter.html?sid98&cid1425 源码文档&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WMvM3j6qhyjIeAT87kIcxg 提取码&#xff1a;5g56 Java多线程与并发编程 1-并发背后的故事什么是并发 2-你必须知道线程的概念程…

“黑客”入门学习之“单机游戏外挂原理与实现”

“黑客”入门学习之“单机游戏外挂原理与实现”&#xff08;文末全套黑客资料教程&#xff09; 昨天给小伙伴们分享了一篇"游戏外挂原理与实现"的文章&#xff0c;小伙伴们很热情&#xff0c;反响很好&#xff0c;好多朋友私信我&#xff0c;或者直接回复我"写…

PMP P-03 Scope Management

范围管理&#xff1a;要做多少事情&#xff0c;内容

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

代码随想录算法训练营第四十七天|LeetCode 382,115

目录 LeetCode 392.判断子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组 LeetCode 115.不同的子序列 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历顺序 …

压缩包密码的破解

给压缩包添加密码 解密 将压缩包的加密信息放入新建的文本文档 zip2john 123.zip > mima.txt 使用john解密 john mima.txt john的密码字典路径 cd /etc/share/john ls 查看有多少行密码

压缩包解压密码怎么破

从网上下载的资源大多数都是以压缩包形式被下载下来&#xff0c;我们需要通过解压压缩包拿到我们想要的文件&#xff0c;但是有时候可能会遇到解压压缩包的时候需要密码的情况&#xff0c;那压缩包解压秘密该怎么破解呢&#xff1f;如果文件资源对你来说很重要的话&#xff0c;…

Linux系统:CentOS 7 CA证书服务器部署

目录 一、理论 1.CA认证中心 2.CA证书服务器部署 二、实验 1. CA证书服务器部署 一、理论 1.CA认证中心 &#xff08;1&#xff09;概念 CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户发放数字证…

D - President - 背包dp

分析&#xff1a; 需要让所有x大于y的对应的z的总数大于z总共的数量的一半&#xff0c;找最小需要转化的数量&#xff0c;那么可以转化为01背包问题&#xff0c;z作为体积&#xff0c;每组的x和y都可以计算出一个值表示需不需要转化&#xff0c;作为背包价值&#xff0c;如果x大…