题解
2025-02-24 12:59:00
发布于:广东
71阅读
0回复
0点赞
,爆搜肯定会超时,所以我们使用 算法。
我们把数据拆成两半,用两个集合记录下这两半所有的状态,然后去贪心匹配。
假设第一个集合内有一个状态为 ,模数为 。那么如果想让和最大,那么就得找第二个集合中最后一个小于 的数。
代码如下:
#include <iostream>
#include <cstdio>
#include <set>
#define int long long
using namespace std;
int a[105], n, x;
set <int> state1, state2;
void dfs(int ct, int n, int cur, set <int> &state){//深搜,枚举所有的状态
if(ct > n){
state.insert(cur);
return;
}
dfs(ct + 1, n, (cur + a[ct]) % x, state);
dfs(ct + 1, n, cur, state);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> x;
for(int i = 1; i <= n; i++) cin >> a[i];
dfs(1, n / 2, 0, state1);
dfs(n / 2 + 1, n, 0, state2);
int mx = 0;
for(int i:state1){
auto it = state2.lower_bound(x - i);
it--;
mx = max(mx, i + *it);//寻找能匹配的最大值
}
cout << mx;
return 0;
}
设 ,则时间复杂度为 。
全部评论 1
%%%
2025-02-24 来自 北京
0
有帮助,赞一个