2023-01-04:有三个题库A、B、C,每个题库均有n道题目,且题目都是从1到n进行编号
每个题目都有一个难度值
题库A中第i个题目的难度为ai
题库B中第i个题目的难度为bi
题库C中第i个题目的难度为ci
小美准备组合出一套试题,试题共有三道题,
第一题来自题库A,第二题来自题库B,第三题来自题库C
试题要求题目难度递增,且梯度不能过大
具体地说,第二题的难度必须大于第一题的难度,但不能大于第一题难度的两倍
第三题的难度必须大于第二题的难度,但不能大于第二题难度的两倍
小美想知道在满足上述要求下,有多少种不同的题目组合
(三道题目中只要存在一道题目不同,则两个题目组合就视为不同
输入描述 第一行一个正整数n, 表示每个题库的题目数量
第二行为n个正整数a1, a2,… an,其中ai表示题库A中第i个题目的难度值
第三行为n个正整数b1, b2,… bn,其中bi表示题库B中第i个题目的难度值
第四行为n个正整数c1, c2,… cn,其中ci表示题库C中第i个题目的难度值
1 <= n <= 20000, 1 <= ai, bi, ci <= 10^9。
来自美团。

答案2023-01-04:

双指针不回退+前缀和数组。
时间复杂度O(N * logN)。因为要排序。
空间复杂度O(N)。
用rust和solidity写代码。

代码用rust编写。代码如下:

use rand::Rng;
use std::iter::repeat;
fn main() {
let mut a = vec![71, 29, 13, 74, 90, 8, 30, 25];
let mut b = vec![72, 1, 50, 98, 86, 86, 52, 57];
let mut c = vec![11, 24, 61, 70, 11, 90, 13, 30];
let ans = ways2(&mut a, &mut b, &mut c);
println!("ans = {}", ans);
let nn: i32 = 100;
let vv: i32 = 100;
let test_time: i32 = 5000;
println!("测试开始");
for i in 0..test_time {
let n = rand::thread_rng().gen_range(0, nn) + 1;
let mut a = random_array(n, vv);
let mut b = random_array(n, vv);
let mut c = random_array(n, vv);
let ans1 = ways1(&mut a, &mut b, &mut c);
let ans2 = ways2(&mut a, &mut b, &mut c);
if ans1 != ans2 {
println!("出错了!{}", i);
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
} // 暴力方法
// 时间复杂度O(N^3)
// 为了验证
fn ways1(a: &mut Vec<i32>, b: &mut Vec<i32>, c: &mut Vec<i32>) -> i32 {
let n = a.len() as i32;
a.sort();
b.sort();
c.sort();
let mut ans = 0;
for i in 0..n {
let mut j = 0;
while j < n && b[j as usize] <= a[i as usize] * 2 {
if b[j as usize] > a[i as usize] {
let mut k = 0;
while k < n && c[k as usize] <= b[j as usize] * 2 {
if c[k as usize] > b[j as usize] {
ans += 1;
}
k += 1;
}
}
j += 1;
}
}
return ans;
} // 正式方法
// 时间复杂度O(N * logN)
fn ways2(a: &mut Vec<i32>, b: &mut Vec<i32>, c: &mut Vec<i32>) -> i32 {
let n = a.len() as i32;
a.sort();
b.sort();
c.sort();
// B里面的记录
let mut help: Vec<i32> = repeat(0).take(n as usize).collect();
let mut i = 0;
let mut l = -1;
let mut r = 0;
while i < n {
while l + 1 < n && c[(l + 1) as usize] <= b[i as usize] {
l += 1;
}
while r < n && c[r as usize] <= b[i as usize] * 2 {
r += 1;
}
help[i as usize] = get_max(r - l - 1, 0);
i += 1;
}
for i in 1..n {
help[i as usize] += help[(i - 1) as usize];
}
let mut ans = 0;
let mut i = 0;
let mut l = -1;
let mut r = 0;
while i < n {
while l + 1 < n && b[(l + 1) as usize] <= a[i as usize] {
l += 1;
}
while r < n && b[r as usize] <= a[i as usize] * 2 {
r += 1;
}
if r - l - 1 > 0 {
ans += sum(&mut help, l + 1, r - 1);
}
i += 1;
}
return ans;
} fn sum(help: &mut Vec<i32>, l: i32, r: i32) -> i32 {
return if l == 0 {
help[r as usize]
} else {
help[r as usize] - help[(l - 1) as usize]
};
} fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
} // 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32> {
let mut arr: Vec<i32> = vec![];
for _i in 0..n {
arr.push(rand::thread_rng().gen_range(0, v));
}
return arr;
}

代码用solidity编写。代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17; contract Hello{
function main() public pure returns (int32){
int32[] memory a = new int32[](8);
a[0] = 71;
a[1] = 29;
a[2] = 13;
a[3] = 74;
a[4] = 90;
a[5] = 8;
a[6] = 30;
a[7] = 25;
int32[] memory b = new int32[](8);
b[0] = 72;
b[1] = 1;
b[2] = 50;
b[3] = 98;
b[4] = 86;
b[5] = 86;
b[6] = 52;
b[7] = 57;
int32[] memory c = new int32[](8);
c[0] = 11;
c[1] = 24;
c[2] = 61;
c[3] = 70;
c[4] = 11;
c[5] = 90;
c[6] = 13;
c[7] = 30;
int32 ans = ways2(a,b,c);
return ans;
} // 正式方法
// 时间复杂度O(N * logN)
function ways2(int32[] memory a, int32[] memory b, int32[] memory c) public pure returns (int32){
int32 n = int32(int(a.length));
sort(a);
sort(b);
sort(c);
// B里面的记录
int32[] memory help = new int32[](uint(uint32(n)));
int32 l = -1;
int32 r = 0;
for (int32 i = 0; i < n; i++) {
while (l + 1 < n && c[uint(uint32(l + 1))] <= b[uint(uint32(i))]) {
l++;
}
while (r < n && c[uint(uint32(r))] <= b[uint(uint32(i))] * 2) {
r++;
}
help[uint(uint32(i))] = getMax(r - l - 1, 0);
}
for (int32 i = 1; i < n; i++) {
help[uint(uint32(i))] += help[uint(uint32(i - 1))];
}
int32 ans = 0;
l = -1;
r = 0;
for (int32 i = 0; i < n; i++) {
while (l + 1 < n && b[uint(uint32(l + 1))] <= a[uint(uint32(i))]) {
l++;
}
while (r < n && b[uint(uint32(r))] <= a[uint(uint32(i))] * 2) {
r++;
}
if (r - l - 1 > 0) {
ans += sum(help, l + 1, r - 1);
}
}
return ans;
} function sum(int32[] memory help, int32 l, int32 r) public pure returns (int32){
return l == 0 ? help[uint(uint32(r))] : help[uint(uint32(r))] - help[uint(uint32(l - 1))];
} function getMax(int32 a,int32 b) public pure returns (int32){
if(a>b){
return a;
}else{
return b;
}
} function sort(int32[] memory arr)public pure{
int32 temp = 0;
for(int32 i = 1; i <= int32(int(arr.length)) - 1; i++) {
for(int32 j = i; j > 0; j--) {
if(arr[uint(uint32(j - 1))] > arr[uint(uint32(j))]) {
temp = arr[uint(uint32(j))];
arr[uint(uint32(j))] = arr[uint(uint32(j - 1))];
arr[uint(uint32(j - 1))] = temp;
}else {
//不满足条件结束循环即可
break;
}
}
}
}
}


2023-01-04:有三个题库A、B、C,每个题库均有n道题目,且题目都是从1到n进行编号 每个题目都有一个难度值 题库A中第i个题目的难度为ai 题库B中第i个题目的难度为bi 题库C中第i个题目的更多相关文章

  1. <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY

    MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...

  2. Java中生成一个唯一值的方式

    现总结几种生成一个唯一值的方式 第一种:采用nanoTime() // 理论上存在重复的可能,可以在后面再加上一个随机字符串 Random r = new Random(); for (int i = ...

  3. [SQL]select scope_identity()传回插入相同范围之识别资料行中的最后一个识别值

    传回插入相同范围之识别资料行中的最后一个识别值.范围是一个模组:预存程序.触发程序.函数或批次.因此,如果两个陈述式在相同预存程序.函数或批次中,它们就在相同范围中. 语法: SCOPE_IDENTI ...

  4. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  5. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  6. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...

  7. Python学习笔记之7.5 - 定义有默认参数的函数》》》直接在函数定义中给参数指定一个默认值,默认参数的值应该是不可变的对象

    问题: 你想定义一个函数或者方法,它的一个或多个参数是可选的并且有一个默认值. 解决方案: 定义一个有可选参数的函数是非常简单的,直接在函数定义中给参数指定一个默认值,并放到参数列表最后就行了.例如: ...

  8. 面试官:实现一个带值变更通知能力的Dictionary

    如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?今天我们聊这个刚性需求. 前文提要: 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库. 上文中:DBA在为 ...

  9. 调试台自动多出现一个'&#65279;' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个'&#65279;'

    对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...

  10. 从一个int值显示相应枚举类型的名称或者描述

    我正在做一个出入库管理的简单项目,在Models里定义了这样的枚举类型 public enum InOrOut { [Description("出库")] Out = , [Des ...

随机推荐

  1. badapple最后一步,讲黑白图转为字符图,然后输出就行了。

    from PIL import Image import os char_s = list(" .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\ ...

  2. SQL注入,Hacker入侵数据是如何做到的

    什么是SQL注入? SQL注入就是未将代码与数据进行严格的隔离,导致在读取用户数据的时候,错误地把黑客注入的数据作为代码的一部分执行. SQL注入自诞生以来以其巨大的杀伤力闻名. 例子: 典型的SQL ...

  3. RTE NG-Lab:一起探索下一代实时互动新世界

    互联网已经彻底改变了我们的工作和生活.从纸书信笺,到智能手机中的 App,再到 VR 头显,实时互动体验逐代升级,已经成为了我们生活的一部分.随着元宇宙的爆火,新增的实时互动场景日益颠覆着我们的想象力 ...

  4. CPU 100%问题排查总结

    更多内容,移步IT-BLOG 排查思路 [1]定位高负载进程 pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到 ...

  5. idea创建Spring项目时选择Maven还是Spring initializr?

    今天在使用idea创建Spring项目时不知道选择Maven还是Spring initializr 接着都实验了一下,其实本质是一样的,使用"spring initializr"创 ...

  6. (原创)【B4A】一步一步入门09:xCustomListView,加强版列表、双行带图片、复选框按钮等自定义列表项(控件篇05)

    一.前言 上篇((原创)[B4A]一步一步入门08:ListView,列表.单行.双行.双行带图片.列表项样式(控件篇04))我们讲了ListView,目前官方已经不推荐再使用ListView了,而是 ...

  7. 浅谈Vue 2.x当中组件之间传值方式

    一.父子之间传值 1. 父传子 :props <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. ChatGPT搭建AI网站实战

    1.概述 ChatGPT是一款基于GPT-3.5架构的大型语言模型,它能够进行自然语言处理和生成对话等任务.作为一款智能化的聊天机器人,ChatGPT有着广泛的应用场景,如在线客服.智能助手.个性化推 ...

  9. 关于关键字final用法以及意义

    *   * 1.final可以用来修饰的结构:类.方法.变量  *   * 2.final用来修饰一个类:此类不能被其他类所继承.  *           比如:String类.System类.St ...

  10. Flask+Gunicorn+Nginx配置多个app

    请自行安装好nginx.gunicorn和flask的运行环境,这里不再赘述 Nginx配置 修改nginx的配置 vi /etc/nginx/sites-available/default //de ...