Vmware 笔试

前言:两道题都只拿一大半分数,并未 AC,欢迎提错!

1、从两个数组中分别选取一个数,使得 (a+b)%p 最小,1<=a,b, p<=1e18, size1, size2 <= 100000

// 感觉一个简单的二分就可,错误的部分已经xiug
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXNM = 1e5+5;
typedef long long ll;
int main() {
    int n, m;
    ll p, nn[MAXNM], nm[MAXNM];
    scanf("%d%d%lld", &n, &m, &p);
    for(int i = 0; i < n; i++) {
        scanf("%lld", &nn[i]);
    }
    for(int i = 0; i < m; i++) {
        scanf("%lld", &nm[i]);
    }

    sort(nm, nm+m);

    ll ans = p;
    for(int i = 0; i < n; i++) {
        // 可以简化
        if(nn[i] + nm[0] >= p) {
            ans = min(ans, (nn[i]+nm[0])%p);
        } else if(nn[i]+nm[m-1] <= p) {
          //ans = min(ans, (nn[i]+nm[m-1])%p); error
            ans = min(ans, (nn[i]+nm[0])%p);
        } else {
            int left = 0, right = m-1;
            while(left < right) {
                int mid = (left+right)>>1;
                if(nn[i] + nm[mid] >= p) {
                    right = mid;
                } else {
                    left = mid+1;
                }
            }
            // 两种情形:nn[i]+nm[right]>p & nn[i]+nm[right]=p
            ans = min(ans, (nn[i]+nm[right])%p);
//            ans = min(ans, (nn[i]+nm[right-1])%p);   error
            ans = min(ans, (nn[i]+nm[0])%p);
        }
   }
   cout << ans << '\n';
}

3、n 种色调,冷色调为负数,暖色调为正数,现给定 n 种色调 和 x(色调最大值绝对值),加最少的色调使色调和为 0, n,x <= 1000

// 因为是最后提交的,没太清楚到底 AC 了没有,不过 s/k+1都有一大半分数,这里考虑 s 为负数情况
int ans = 0;
if(s != 0) { // s 为累加色调和
    ans = abs(s)/k + abs(s)%k != 0;
}

2 题 有朋友不介意可以补充一下

#笔试题目##VMware#
全部评论
你第一题的nn[i]+nm[m-1] <= p情况,应该是 ans = min(ans, (nn[i]+nm[0])%p) 吧; 同求第二题解法,怎么想也没办法降到O(mn)以下
2 回复
分享
发布于 2020-09-26 13:03
第二题:有长度为n的数组a,然后会给出m个操作序列,对每个序列 [l,r,v],你需要给a[l]到a[r]的所有数字加 组合数comb(i-l+v,v),在m次操作之后将a数组输出。 1<=m,n<=10000 1<=v<=100
点赞 回复
分享
发布于 2020-09-26 13:08
阿里巴巴
校招火热招聘中
官网直投
第二题,已经AC。不过我有三道编程题目,为什么你是两题? 第二题Java代码如下: import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main {          public static void main(String[] args) {         m3();     }     public static void m3(){         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int x = in.nextInt();         double sum = 0;         for(int i=0;i<n;i++){             sum+=in.nextInt();         }         sum = Math.abs(sum);         System.out.println(sum%x==0?(int)sum/x:(int)sum/x+1);     } }
点赞 回复
分享
发布于 2020-09-26 18:14

相关推荐

1 13 评论
分享
牛客网
牛客企业服务