阿里笔试|3.25阿里笔试 编程题 讨论
12060
2022.03.25
2022.03.25
发布于 中国

T1 模拟题

题目比较长就不描述了 ... 就是一道 字符串 模拟题

通过 83.33% (错误原因 : 字符串中可能存在 空格 需要用 getline(cin,s) 来读取字符串)

T2 贪心 + 二分

题目描述

输入 : 5 个数 : , 数据范围 , 每次操作 取 其中 4 个数 减 一
输出 : 最多的操作次数

解题思路

  1. 首先将 进行排序
  2. 然后将 都减去
  3. 然后可以将 给分配 使得 最大 (可以 二分求解 最后的 )

通过 100%

代码参考

void solve() {
    for(int i = 0;i < 5;i ++) cin >> w[i];
    sort(w,w + 5);
    for(int i = 2;i < 5;i ++) w[i] -= w[0];
    int l = 0 , r = w[1];// w[1:4] 的最小值 的最大值 的范围
    while(l <= r) {
        int mid = (l + r) / 2;
        int d = w[1] - mid;
        for(int i = 2;i < 5;i ++) {
            if(w[i] < mid) d -= mid - w[i];
        }
        if(d < 0) r = mid - 1;
        else l = mid + 1;
    }
    cout<<w[0] + l - 1<<"\n";
}

T3 背包题

题目描述

有 n 条直线 , , , 每条直线初始没有颜色。

  1. 你可以给每条直线上色 —— 黑色 或者 白色。
  2. 你可以平移任意直线

输入 : n , 和 n 行数据

输出 : 黑白线的最多的交点(即 黑白点)个数

解题思路

  1. 首先明确 :
    • 因为每一条直线都可以平移 , 所以 没有作用
    • 两条平行的线之间无论如何都不会存在交点
    • 如果有 条 黑线 , 那么任意一条与其都不平行的白线能产生的 交点个数为 个。所以若 黑色的 有 条 , 白色 的有 条 , 且 黑色和白色的都不存在两条相互平行 , 那么此时能产生的最大的点的个数为 :
  2. 所以 :
    • 首先我们按照 的最简形式 来作为每一条直线的特征 , 平行的定义为同一条直线 , 用 来存储
    • 然后用 来表示 是否存在 最终黑色的线有 条的方案
  3. 最后 枚举 , 如果 , 更新

通过 (93.33%) 14/15

代码参考

void solve() {
    cin >> n;
    map<PII,int> mp;
    for(int i = 0;i < n;i ++) {
        cin >> A[i] >> B[i] >> t;
        if(A[i] < 0) A[i] = -A[i] , B[i] = -B[i];
        t = gcd(A[i],B[i]); A[i] /= t , B[i] /= t;
        mp[{A[i],B[i]}] ++;
    }
    vector<int> h;
    for(auto& [k,v] : mp) h.push_back(v);
    vector<bool> dp(n + 1,false);
    dp[0] = true;
    for(auto& s : h) {
        for(int i = n;i >= s;i --) if(dp[i - s]) dp[i] = true;
    }
    int res = 0;
    for(int i = 1;i < n;i ++) if(dp[i]) res = max(res,(n - i) * i);
    cout<<res<<"\n";
}
评论 (44)