Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)
首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x。
当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可。
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5+5; int a[maxn]; int pf[maxn],sf[maxn]; int main() { int n,k,x; scanf("%d%d%d",&n,&k,&x); for(int i = 1; i <= n; i++){ scanf("%d",a+i); pf[i] = pf[i-1]|a[i]; } for(int i = n; i >= 1; i--){ sf[i] = sf[i+1]|a[i]; } long long ans = pf[n]; for(int i = 1; i <= n; i++){ long long t = a[i]; int ct = k; while(ct--) t *= x; ans = max(ans,t|pf[i-1]|sf[i+1]); } printf("%I64d",ans); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步