谁可以用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
#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;
}