比赛 |
2025.5.5 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
friends |
最终得分 |
100 |
用户昵称 |
darkMoon |
运行时间 |
14.087 s |
代码语言 |
C++ |
内存使用 |
5.54 MiB |
提交时间 |
2025-05-05 10:11:13 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
auto IN = freopen("friends.in", "r", stdin);
auto OUT = freopen("friends.out", "w", stdout);
auto IOS = ios::sync_with_stdio(false);
auto CIN = cin.tie(nullptr);
const int M = 262144 << 1, N = 1e5 + 5;
int n, k, a[N], su[M], m, ma;
bool check(int mid){
memset(su, 0, sizeof(su));
for(int i = 1; i <= mid; i ++){
int tmp = 0;
for(int j = 1; j <= n; j ++){
if((i + a[j] - 1) / a[j] % 2){
tmp |= 1 << j - 1;
}
}
su[tmp] ++;
// cout << "*** " << i << " " << (bitset<3>)tmp << "\n";
}
for(int j = 0; j < n; j ++){
for(int i = 0; i < ma; i ++){
if(i >> j & 1){
su[i] += su[i ^ (1 << j)];
}
}
}
for(int i = 1; i < ma; i ++){
if(su[(ma - 1) ^ i] > mid - k * __builtin_popcount(i)){
return 0;
}
}
return 1;
}
signed main(){
cin >> n >> k;
ma = 1 << n;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
int l = 0, r = 2 * n * k;
while(l < r){
int mid = l + r >> 1;
if(check(mid)){
r = mid;
}
else{
l = mid + 1;
}
}
printf("%lld", l);
return 0;
}