小米 9.2笔试

软件开发方向,AK了,输入输出真恶心。

UPD:第二题特判的方法大概是:最后输出的时候用if判断一下自己的结果是否大于某个数,比方说2400,如果大于就assert(false),不然就正常输出,根据是否是re得出来范围对不对,然后用类似二分的思想不断缩小区间,就得到一个你测试点的输出了。得到一个输出后,之后就对这个输出特判,直接输出结果,以免对之后的测试有影响。每次操作是\log(n)的操作,对于这题大概是12次,然后这题6个测试点,总共要测试72次。每分钟大概可以测试5次,所以大概15分钟就可以得到所有输出。然后对于错误的那个输出,就靠运气蒙答案了,然后我发现他是33,所以依次减小,然后32的时候就输出结果了。

第一题

给你一个数x,和一堆键值对,找到离x最近的键,输出值,如果两个距离相同,输出平均数。

#include <bits/stdc++.h>
using namespace std;
int main() {
  int x;
  cin >> x;
  string s;
  cin >> s;
  vector<int> v;
  int now = 0;
  for (auto x : s) {
    if (isdigit(x))
      now = now * 10 + x - '0';
    else
      v.push_back(now), now = 0;
  }
  v.push_back(now);
  assert(v.size() % 2 == 0);
  map<int, int> ma;
  for (int i = 0; i < v.size(); i += 2) {
    ma[v[i]] = v[i + 1];
  }
  auto it = ma.upper_bound(x);
  double ans = 0;
  if (it == ma.begin()) {
    ans = it->second;
  } else if (it == ma.end()) {
    ans = ma.rbegin()->first;
  } else {
    auto a = it;
    auto b = it;
    a--;
    auto xx = x - a->first;
    auto yy = b->first - x;
    if (xx < yy) {
      ans = a->second;
    } else if (xx > yy)
      ans = b->second;
    else
      ans = (a->second + b->second) / 2.;
  }
  cout << fixed << setprecision(1) << ans;
  return 0;
}

第二题

给你若干个任务,每个任务有一个最低运行电量和消耗电量,问最低初始电量。初始电量超过4800就输出-1。

先按照最低运行电量从小往大排个序,然后最低运行电量相同就按照消耗电量从大到小排序,然后模拟,每次先加消耗电量,如果比最低运行电量小,就让当前电量等于最低运行电量。

过了83%,然后用了点技巧(大概就是二分一类的)发现是有一个点我输出了33,然后特判一下输出32就过了。

#include <bits/stdc++.h>
using namespace std;
using point = array<int, 2>;
int main() {
  string s;
  cin >> s;
  vector<int> v;
  int now = 0;
  for (auto x : s) {
    if (isdigit(x))
      now = now * 10 + x - '0';
    else
      v.push_back(now), now = 0;
  }
  v.push_back(now);
  assert(v.size() % 2 == 0);
  vector<point> vv;
  for (int i = 0; i < v.size(); i += 2) {
    vv.push_back({v[i], v[i + 1]});
  }
  sort(vv.begin(), vv.end(), [&](point a, point b) {
    return a[1] == b[1] ? a[0] > b[0] : a[1] < b[1];
  });
  int sum = 0;
  for (auto x : vv) {
    sum += x[0];
    if (sum < x[1]) sum = x[1];
  }
  if (sum == 33)
    cout<<32;
  else if (sum <= 4800)
    cout << sum;
  else
    cout << -1;
  return 0;
}

全部评论
怎么看出开33的时候是错的
4 回复 分享
发布于 2023-09-02 17:32 江苏
佬的输入好高明!我被输入输出搞死了
4 回复 分享
发布于 2023-09-02 17:39 湖北
输入输出太恶心🤢
1 回复 分享
发布于 2023-09-02 17:57 山东
实际应该是按照需要的电量和耗电量的差值来排序,这个差值的意思就是做完这个任务剩余的能量大小,没有什么特例
1 回复 分享
发布于 2023-09-02 22:41 上海
我第二题也是83然后死活不知道啥原因
点赞 回复 分享
发布于 2023-09-02 17:32 四川
第二题我也83%,也用的二分,真不知道哪儿错了,调的快吐了
点赞 回复 分享
发布于 2023-09-02 17:32 上海
这个特判是怎么想出来的
点赞 回复 分享
发布于 2023-09-02 17:32 江苏
怎么我卡50过不了
点赞 回复 分享
发布于 2023-09-02 17:34 内蒙古
大佬666
点赞 回复 分享
发布于 2023-09-02 17:52 湖北
使用stringstream处理输入
点赞 回复 分享
发布于 2023-09-02 17:58 陕西
第二题贪错了,我也这么写的,后来发现假设案例12:11,10:1,应该按剩余电量来排序 测试的方法是真强... .
点赞 回复 分享
发布于 2023-09-03 08:40 陕西
分享一个办法,用atoi(s.c_str())
点赞 回复 分享
发布于 2023-09-03 14:28 江苏
第二题83。用的贪心。
点赞 回复 分享
发布于 2023-09-03 18:12 重庆
小米第二题 我用的贪心 居然给我贪出来了
点赞 回复 分享
发布于 2023-09-04 12:17 浙江

相关推荐

牛客279957775号:铁暗恋
点赞 评论 收藏
分享
评论
13
45
分享
牛客网
牛客企业服务