当前位置: 首页 > news >正文

2018网易在线笔试题

第一题

695653-20180327225452037-1123534130.png

解决思路:分类讨论
当k==0的时候,有n*n对答案
当k!=0的时候,设x%y=z,z>=k.分类讨论:当x<y的时候,当x>y的时候

def simple(n, k):
    cnt = 0
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if i % j >= k:
                cnt += 1
    return cnt


def better(n, k):
    if k == 0:
        return n * n
    s = 0
    for i in range(k, n + 1):
        s += n - i
    for i in range(k + 1, n):
        group_count = n // i
        s += (group_count - 1) * (i - k)
        s += max(0, n % i - k + 1)
    return s


def test():
    import random
    n = random.randint(3, 100)
    k = random.randint(0, n)
    return simple(n, k) == better(n, k)


for _ in range(1000):
    ans = test()
    if not ans:
        exit(-1)

第二题

695653-20180328215510083-2042983306.png

解决思路:如果暴力枚举,$2^{30}$显然太大了.如果是$2^15$那该多好哇!那样我就只需要开辟一个大数组,从0,一直循环到$2^{15}-1$就可以了.
此题的正确思路就是:分治,创建两个大数组a[65536],b[65536],分别表示前半部分物品选择情况和后半部分选择情况,a[i]表示决策i(用i的二进制表示是否选择某个物品)的体积总和.接下来,对于每一个a[i],寻找b中小于v-a[i]的决策.此步可以通过排序+二分搜索极好地优化.

于是余有叹焉:

这道题的分治真是令人大开眼界,仔细回忆一下,我们过去学过的一切分治算法,无一不是跟递归紧密联系起来的.似乎解决问题一旦分治就要以递归的方式分治到底.
而实际上,这却是错觉.
程序设计的目的在于在有限的时间和空间内实现某个目的,如果分治一次足以解决任务,那就够了.在这道题中,只能够分治一次,而无法做到多次分治.因为既然分治,必然涉及到合并分治结果.而多次分治就会造成合并困难.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
static long[] build(int[] a, int beg, int end) {
    int n = end - beg;
    long ans[] = new long[1 << n];
    for (int i = 0; i < ans.length; i++) {
        long s = 0;
        for (int j = 0; j < n; j++) {
            if ((i & (1 << j)) != 0) {
                s += a[beg + j];
            }
        }
        ans[i] = s;
    }
    return ans;
}

static int ceil(long[] ar, long x) {
    int l = 0, r = ar.length;
    while (l + 1 < r) {
        int m = (l + r) >> 1;
        if (ar[m] > x) {
            r = m;
        } else if (ar[m] < x) {
            l = m;
        } else {
            l = m;
        }
    }
    return r;
}

static int merge(long[] first, long[] second, int v) {
    int s = 0;
    for (int i = 0; i < first.length; i++) {
        if (first[i] > v) break;
        else {
            s += ceil(second, v - first[i]);
        }
    }
    return s;
}

static int solve(int[] a, int v) {
    Arrays.sort(a);
    long[] first = build(a, 0, a.length / 2);
    long[] second = build(a, a.length / 2, a.length);
    Arrays.sort(first);
    Arrays.sort(second);
    return merge(first, second, v);
}

public static void main(String[] args) throws FileNotFoundException {
//    Scanner cin = new Scanner(System.in);
    Scanner cin = new Scanner(new FileInputStream("in.txt"));
    int n = cin.nextInt();
    int v = cin.nextInt();
    int[] a = new int[n];
    for (int i = 0; i < n; i++) a[i] = cin.nextInt();
    cin.close();
    if (n == 1) {
        System.out.println("1");
    } else {
        int ans = solve(a, v);
        System.out.println(ans);
    }
}
}

相关文章:

  • 面试题:Student s = new Student();在内存中做了哪些事情?即创建一个对象做了哪些事情...
  • Unity Shader-后处理:简单均值模糊
  • AppScan扫描
  • etcd使用入门(二)
  • 将被自然语言处理和文字分析颠覆的行业:法律,保险和客服
  • 16.1 Tomcat介绍;16.2 安装jdk;16.3 安装Tomcat
  • win10 为了对电脑进行保护,已经阻止此应用 解决方法
  • Hadoop实战项目:小文件合并
  • Apache Calcite Avatica 1.10.0 发布,动态数据管理框架
  • Ambari-单步创建cluster
  • worker模式 多线程实现
  • Akamai 发布互联网安全报告:DDoS 攻击量激增
  • Android 采用AOP方式封装6.0权限管理
  • WebMIS 2016-09 稳定版,基于 Phalcon 的 CMS
  • 实验吧_加了料的报错注入
  • 【笔记】你不知道的JS读书笔记——Promise
  • EventListener原理
  • Java 内存分配及垃圾回收机制初探
  • JavaScript设计模式系列一:工厂模式
  • Linux Process Manage
  • Python学习之路13-记分
  • Shell编程
  • tab.js分享及浏览器兼容性问题汇总
  • vue学习系列(二)vue-cli
  • yii2权限控制rbac之rule详细讲解
  • yii2中session跨域名的问题
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 对象引论
  • 简单实现一个textarea自适应高度
  • 理解在java “”i=i++;”所发生的事情
  • 如何合理的规划jvm性能调优
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 为视图添加丝滑的水波纹
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 最近的计划
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Python 之网络式编程
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #Ubuntu(修改root信息)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 中的轻量级线程安全
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @Transient注解
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [AR Foundation] 人脸检测的流程
  • [C++]运行时,如何确保一个对象是只读的
  • [CISCN2019 华东北赛区]Web2
  • [docker]docker网络-直接路由模式