写代码时长两年半的屑 2023-04-29 17:11 采纳率: 100%
浏览 11
已结题

c++如何做天枰问题?

谁可以用c++解释一下?
真假金币 查看测评数据信息
小C是个探险家,在金银岛上找到了许多宝藏,其中就有n袋金币,每袋金币数量为a_i。可是后来有坏人把其中几袋换成假币了,经过检查后发现每袋金币要么全是真币(每个重5克),要么全是假币(每个重4克)。
如果现在只有一台电子秤,n袋金币依次排列,你可以从每袋金币中挑出若干枚进行一次称量(也可以一枚都不选),若要确定前1,2,……,n袋金币的真假,至少要称量几次呢?
输入格式
第一行一个整数n,表示有n袋金币。
接下来一行n个整数a_i,表示每袋金币的数量。
输出格式
n行,每行一个整数,第i行表示想要确定前i袋金币的真假至少要称量几次。
输入/输出例子1
输入:
3
2 3 4
输出:
1
1
1
样例解释
以前三袋硬币为例,分别取出1、2、4枚硬币,则一次称量的结果即可确定三袋的真假。

对于10%的数据,n≤1
对于30%的数据,n≤2
对于60%的数据,n≤100
对于80%的数据,n≤1000
对于100%的数据,n≤10^5,a_i≤10^9
存在10%的数据,a_i=1
  • 写回答

1条回答 默认 最新

  • Py小郑 新星创作者: python技术领域 2023-04-29 17:21
    关注
    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    // 判断当前袋子里是否全是真金币
    bool is_all_real(vector<int>& v) {
        for (int i = 0; i < v.size(); i++) {
            if (v[i] == 4) return false;
        }
        return true;
    }
    
    // 二分判断每个金币是真币还是假币
    bool is_real(vector<int>& v, int l, int r) {
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (v[mid] == 4) r = mid;
            else l = mid + 1;
        }
        return v[l] == 5;
    }
    
    int main() {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
    
        vector<int> ans(n);
        for (int i = 0; i < n; i++) {
            if (is_all_real(a)) {
                ans[i] = 1;
                continue;
            }
            int l = 0, r = a[i] - 1;
            while (l < r) {
                int mid = l + (r - l) / 2;
                vector<int> tmp(mid + 1, 4);
                for (int j = mid + 1; j < a[i]; j++) {
                    tmp.push_back(5);
                }
                if (is_real(a, 0, i) && is_real(tmp, 0, tmp.size() - 1)) {
                    l = mid + 1;
                } else {
                    r = mid;
                }
            }
            ans[i] = l + 1;
        }
    
        for (int i = 0; i < n; i++) {
            cout << ans[i] << endl;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月29日