Codeforces E. Maximum Subsequence Value(贪心+鸽巢原理)

https://codeforces.com/contest/1365/problem/E
(题目链接如上↑)
题意:
从a数组中选取一个长度为k的子序列,使得该子序列的value值最大。一个子序列的value值为2^i的和,i为二进制形式下的有效位。当且仅当该子序列中不少于k-2个数的二进制在该位下为1时,该位有效。
题解:
1.当k<=3时,只需要一个数的该位有效即可产生贡献。所以可以直接选三个数,O(n^3)枚举所有的情况,得到value的最大值。
2.当k>3时,当某位有效时,说明至少有k-2个数的该位为1,这种情况显然更加难以满足。但是若从这个子序列中挑三个数,则根据鸽巢原理必然有一个数该位有效。综上,k>3的情况所得到的value值小于等于选三个数所得到的value值。
3.所以,贪心地枚举选三个数的情况即可。
位运算:
0|0=0 0|1=1 1|0=1 1|1=1
故: value=ai | aj | ak
AC代码:

#include  
#include 
using namespace std;
typedef long long ll;
ll a[505];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	ll ans=0;
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			for(int k=j;k<n;k++){
				ans=max(a[i]|a[j]|a[k],ans);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(Codeforces)