贝壳笔试-4道题全部AC

1.回文
#include<iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    while(cin>>n)
    {
        string s;
        cin>>s;
        int low=0,high=n-1,count=0;
        while(low<=high)
        {
            if(s[low]!=s[high])count++;
            low++;
            high--;
        }
        cout<<count<<endl;
    }
}

2.涂颜色
int main() {
  int t;
  scanf("%d", &t);
  while (t--) {
    int n, m;
    scanf("%d %d", &n, &m);
    if (n == 1 && m == 1) {
      printf("1\n");
      continue;
    }
    vector<int> fac_n, fac_m;
    for (int i = 2; i * i <= n; i++) {
      if (n % i == 0) {
        fac_n.pb(i);
        while (n % i == 0) n /= i;
      }
    }
    if (n > 1) fac_n.pb(n);
    for (int i = 2; i * i <= m; i++) {
      if (m % i == 0) {
        fac_m.pb(i);
        while (m % i == 0) m /= i;
      }
    }
    if (m > 1) fac_m.pb(m);
    sort(fac_n.begin(), fac_n.end());
    sort(fac_m.begin(), fac_m.end());
    int Min = 1e9;
    if (!fac_n.empty()) Min = min(Min, fac_n[0]);
    if (!fac_m.empty()) Min = min(Min, fac_m[0]);
    printf("%d\n", Min);
  }
  return 0;
}
3.亦或
int check(int mid) {
  for (int i = mid; i <= n; i++) {
    int res = 0;
    for (int j = 0; j < 30; j++) {
      if (sum[j][i] - sum[j][i - mid] > 0) {
        res |= (1 << j);
      }
    }
    if (res == Max) return true;
  }
  return false;
}
int main() {
  // cout << (1 << 30) << endl;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  Max = 0;
  for (int i = 1; i <= n; i++) {
    Max |= a[i];
  }
  for (int bit = 0; bit < 30; bit++) {
    sum[bit][0] = 0;
    for (int i = 1; i <= n; i++) {
      sum[bit][i] = sum[bit][i - 1];
      if (a[i] & (1 << bit)) {
        sum[bit][i]++;
      }
    }
  }
  int l = 1, r = n;
  while (abs(r - l) > 1) {
    int mid = (l + r) >> 1;
    if (check(mid)) {
      r = mid;
    } else {
      l = mid + 1;
    }
  }
  // cout << l << " " << r << endl;
  for (int i = min(l, r); i <= max(l, r); i++) {
    if (check(i)) {
      printf("%d\n", i);
      break;
    }
  }
  return 0;
}
4.国王

void init() {
  for (int i = 0; i <= 1000; i++) c[i][0] = 1;
  for (int i = 0; i <= 1000; i++) c1[i][0] = 1;
  for (int i = 1; i <= 1000; i++) {
    for (int j = 1; j <= i; j++) {
      c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
      c1[i][j] = (c1[i - 1][j] + c1[i - 1][j - 1]);
    }
  }
}
struct Edge {
  int u, v, a, b;
};
int n, m;
vector<Edge> e;
int fa[1010];
int tfind(int x) {
  if (fa[x] == x)
    return x;
  else
    return fa[x] = tfind(fa[x]);
}
bool cmp(Edge &a, Edge &b) { return c1[a.a][a.b] > c1[b.a][b.b]; }
int main() {
  init();
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v, a, b;
    scanf("%d %d %d %d", &u, &v, &a, &b);
    e.push_back(Edge{u, v, a, b});
  }
  sort(e.begin(), e.end(), cmp);
  for (int i = 1; i <= n; i++) fa[i] = i;
  int num = 0;
  ll res = 0;
  for (const auto &it : e) {
    int u_root = tfind(it.u);
    int v_root = tfind(it.v);
    if (u_root == v_root) continue;
    res = (res + c[it.a][it.b]) % mod;
    num++;
    fa[u_root] = v_root;
    if (num == n - 1) break;
  }
  if (num != n - 1) {
    printf("-1\n");
  } else
    printf("%lld\n", res);
  return 0;
}


#笔试题目##贝壳找房#
全部评论
最后一题生成树好久没写了
1 回复
分享
发布于 2020-08-11 21:16
第二题可以解释一下嘛。。你第二题这是啥呀,,不是应该求最小因数嘛
1 回复
分享
发布于 2020-08-11 23:56
博乐游戏
校招火热招聘中
官网直投
emmm最小生成树的权重不要取负的吗?我记得是求权重和最大
点赞 回复
分享
发布于 2020-08-11 21:59
校友好强
点赞 回复
分享
发布于 2020-08-11 22:18
你好,请问第四题组合数c1代表什么?怎么比较组合数大小的啊
点赞 回复
分享
发布于 2020-08-11 22:32
第三题能解释下思路吗大佬
点赞 回复
分享
发布于 2020-08-11 23:04
有人用java写的吗?第一题跟楼主思路一样 一直提示数组越界 idea没报错
点赞 回复
分享
发布于 2020-08-12 08:57

相关推荐

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