淘天笔试 - 研发 0322 题解

T1

模拟,排序

  • 注意成绩相同按编号从小到大排序,以及保留两位小数
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    vector<int> a(n), sc(n, 10);
    vector b(n, vector<int>(m));
    for (auto &x : a) scanf("%d", &x);
    for (auto &v : b) for (auto &x : v) scanf("%d", &x);
    for (int k, x, i = 0; i < m; ++i) {
        scanf("%d", &k);
        while (k--) scanf("%d", &x), --x, !b[x][i] ? --sc[x] : 0;
    }
    vector<pair<int, int>> ans(n);
    for (int i = 0; i < n; ++i) ans[i] = {40 * max(0, sc[i]) + 6 * a[i], -i};
    sort(ans.begin(), ans.end(), greater<>());
    for (auto [x, y] : ans)
        printf("%d %.2lf\n", -y + 1, x * 0.1);
    return 0;
}

T2

个字符串,任意删除一个非空区间的字符串,最大化完全相同字符串的区间长度。

  • 字符串哈希转换为数字序列
  • 预处理 表示上一个/下一个哈希值不等于 的位置
  • 对于一个分段点 ,答案为
  • set 维护相同 的连续段长度
  • 从后往前枚举分段点 ,将 中删除,统计答案
  • 注意边界条件,
#include <bits/stdc++.h>
using namespace std;
const int B = 97, P = 1e9 + 7;
const int N = 1e6 + 5;
int pw[N]; char str[N];
int main() {
   pw[0] = 1;
   for (int i = 1; i < N; ++i) pw[i] = 1ll * pw[i - 1] * B % P;
   int n, m = 0, ans = 1;
   scanf("%d", &n);
   vector<int> a(n);
   unordered_map<int, int> mp;
   for (int i = 0; i < n; ++i) {
       scanf("%s", str);
       int L = strlen(str), &k = a[i];
       for (int j = 0; j < L; ++j)
           k = (1ll * k * B + str[j] - 'a') % P;
       if (!mp.count(k)) mp[k] = m++;
       k = mp[k];
   }
   vector<int> pre(n), nxt(n);
   pre[0] = -1, nxt[n - 1] = n;
   for (int i = 1; i < n; ++i)
       if (a[i] == a[i - 1]) pre[i] = pre[i - 1];
       else pre[i] = i - 1;
   for (int i = n - 2; i >= 0; --i)
       if (a[i] == a[i + 1]) nxt[i] = nxt[i + 1];
       else nxt[i] = i + 1;
   map<int, set<pair<int, int>>> f;
   for (int i = 0; i < n; ++i)
       f[a[i]].insert({i - pre[i], i});
   for (int i = n - 1; i >= 0; --i) {
       f[a[i]].erase({i - pre[i], i});
       int res = i < n - 1 ? nxt[i + 1] - (i + 1): 0;
       if (0 < i && i + 1 < n && !f[a[i + 1]].empty())
           res += f[a[i + 1]].rbegin()->first;
       ans = max(ans, res);
   }
   printf("%d\n", ans);
   return 0;
}

T3

个人依次采矿,第 个人会采集所有深度不超过 的矿物; 个矿脉,第 个矿脉在深度 都有 1 单位矿物。问每个人分别能采集多少单位矿物?

  • 排序,如果 ,则有:

  • 每次更新 ,双指针维护 upper_bound 即可。

#include <bits/stdc++.h>
using namespace std;
using ll = int64_t;
int main() {
   int n, m;
   scanf("%d%d", &n, &m);
   vector<int> a(n), b(m);
   vector<ll> ans(n);
   for (auto &x : a) scanf("%d", &x);
   for (auto &x : b) scanf("%d", &x);
   sort(b.begin(), b.end());
   for (int i = 0, j = 0, h = 0; i < n && j < m; ++i) {
       if (a[i] <= h) continue;
       ll &sum = ans[i];
       while (j < m && a[i] >= b[j]) sum += b[j++] - h;
       sum += 1ll * (m - j) * (a[i] - h), h = a[i];
   }
   for (auto x : ans) printf("%lld ", x);
   return 0;
}
#笔试##淘天##淘天26届春招##牛客创作赏金赛#
全部评论

相关推荐

一共一个小时,面试难度以及自己的回答算是最近的面试压力比较大的,实习问了30分钟,中间穿插八股。1.redis数据结构2.redis持久化机制3.mysql索引底层4.聚簇索引与非聚簇索引5.索引优化6.索引失效7.mysql执行一条sql8.那么多索引mysql怎么选(不会)9.tcp与udp区别10.tcp为什么可靠11.消息队列作用12.kafka怎么保证消息有序性13.mcp是什么?14.skills是什么?15.jvm内存分配与回收过程(我讲了从创建对象到判断垃圾对象到垃圾回收我全说了一遍,是这个吗?)16.fullgc触发机制17.tcp的拥塞控制流程(不会了)18.分布式事务解决方案,说了2pc,3pc,tcc。算法是反转双向链表,没有按格式输出,但是面试官没让继续写了,面完以为挂了,结果晚上秒过,看看复试什么情况吧。今天百度打电话准备发offer了,业务跟在手子的差不多,很垂,并且说不分日常暑期,只看表现,会有转正机会,但是考虑再三还是拒绝了,百度实习薪资确实有点低,title也不如之前了,但是面试的二位业务老师我很喜欢,对我的评价也不错,希望之后能有机会共事。从三月份到现在一共面了六家,面试次数总共是8场,情况如下:脉脉二面(无答复,默认挂)百度二面已oc美团一面过,下周一二面shein一面过直接HR面游族一面过直接HR面腾讯一面过等待约二面滴滴明天一面面试通过率还是蛮高的,但是大部分都是日常,感觉对我现在的加成不大,大概率不会去,不知道暑期会是什么情况呢唉,希望能有面试吧,继续加油。字节被无hc直接取消了,现在还没人捞,有没有字节HR救救我
不管什么都不想跳动了:本人美团百度快手都待过,建议肯定是直接留快手多一点产出后转正or直接冲字节腾讯暑期吧。一是快手从福利到基建都吊打另外两家。美团现在这个业务比较惨,本来毛利就很低,亏损严重,今年很可能要优化人力降低成本,去了别说日常,就算暑期后面都很可能被优化。百度其实实习生权限挺高的,可以接触到一些含金量高的项目,但是现在的风评不如之前了,薪资也不高。二是转正概率和薪资是跟产出挂钩的,你都在手子已经积累产出了,去其他家日常实习产出都是从0开始,肯定不可能有你在手子转正可能性大啊,现在日常压根没必要去,而且我有两个师弟都是在快手日常转正的,不用太担心,安心留在手子一边多做一点产出然后一边冲字节腾讯暑期,字节腾讯今年实习岗位非常多的,不如好好把握这个,加油。
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

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