9.4 滴滴笔试编程题题解

1. 二分+暴力枚举
#include <bits/stdc++.h>
using namespace std;

int main() {
  using ll = long long;
  int n, k; cin >> n >> k;
  vector<int> v(n);
  for (int i = 0; i < n; i++) cin >> v[i];
  sort(v.begin(), v.end());
  vector<ll> preSum(n+1);
  for (int i = 1; i <= n; i++) {
    preSum[i] = preSum[i-1] + v[i-1];
  }
  auto ck = [&] (int m) -> bool {
    for (int i = 0; i < n-m+1; i++) {
      if (1.0*(preSum[i+m]-preSum[i])/m*k >= v[i+m-1]) {
        return true;
      }
    }
    return false;
  };
  int low = 1, high = n;
  int ans = 1;
  while (low <= high) {
    int m = (low+high)/2;
    if (!ck(m)) {
      high = m-1;
    } else {
      ans = m;
      low = m+1;
    }
  }
  cout << ans << endl;
  return 0;
}
2. 前缀和初始化。有个要注意的点是 t 大于等于16时可以直接输出0,因为 0-9 内的任意个数异或范围为 [0, 16)。总的来说两题都不难,即使想不到也能暴力过一部份。
#include <bits/stdc++.h>
using namespace std;
int main() {
  vector<vector<int>> cnt(70001, vector<int>(20));
  cnt[0][0] = 1;
  for (int i = 1; i < 70001; i++) {
    int s = 0, tmp = i;
    while (tmp) {
      s ^= tmp % 10;
      tmp /= 10;
    }
    for (int j = 0; j < 16; j++) {
      cnt[i][j] = cnt[i-1][j]+(j==s);
    }
  }
  int n; cin >> n;
  vector<int> l(n), r(n), t(n);
  for (int i = 0; i < n; i++) cin >> l[i];
  for (int i = 0; i < n; i++) cin >> r[i];
  for (int i = 0; i < n; i++) cin >> t[i];

  for (int i = 0; i < n; i++) {
    if (t[i] >= 16) {
      cout << 0 << " ";
      continue;
    }
    cout << cnt[r[i]][t[i]] - (l[i] ? cnt[l[i]-1][t[i]] : 0) << " ";
  }
  cout << endl;
  return 0;
}



#滴滴笔试##滴滴23秋招笔试有点儿难啊#
全部评论
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-05 11:15 北京
orz
点赞 回复 分享
发布于 2022-09-04 23:56 陕西
第一题二分是怎么意思啊,可以详细说下嘛
点赞 回复 分享
发布于 2022-09-04 21:55 江苏
大佬啊这是,第一题还以为可以滑动窗口,现在发现没有这种贪心性质,还是要暴力搜索
点赞 回复 分享
发布于 2022-09-04 21:13 广东
前缀和,想都想不到,大佬太牛逼了
点赞 回复 分享
发布于 2022-09-04 21:03 浙江
优秀啊,什么时候像大佬一样优秀😂
点赞 回复 分享
发布于 2022-09-04 20:51 天津
我什么时候才能向大佬一样优秀
点赞 回复 分享
发布于 2022-09-04 20:49 上海
有没有直接输出 0 的?能过多少数据呀?我 打表+递归老是超时,最多才过80%
点赞 回复 分享
发布于 2022-09-04 20:48 北京
大佬优秀
点赞 回复 分享
发布于 2022-09-04 20:45 辽宁

相关推荐

DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 13:52
点赞 评论 收藏
分享
评论
11
27
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务