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

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日

悬赏问题

  • ¥15 ssh登录页面的问题
  • ¥60 渗透一个指定银行app,拿到客户信息,需要什么级别
  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图