题目:click
题意:给定n个元素的数组,当数组的数分为二进制,你可以挑选k个数,如果这k个数的二进制的第i位的1的个数大于等于max(1,k-2),那么就计算他的贡献值。问最大的贡献值。
可以发现,k<=3的时候只要有一个1就是贡献,本质就是或操作,当话需要其他位贡献的时候,k=4那么需要2个1,比如3个构成了:101011
我需要去贡献第2位的1那么需要两个不可能做到,再增加需要3个,而且对比他高的位数可能会发生负贡献,O(
)暴力即可。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
const int MAXlen=1e5+10;
long double eps=1e-9;
ll a[510];
int book[62];
int vis[62];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
ll ans=0;
for(i=1;i<=n;i++)
{
ll temp=0;
temp|=a[i];
ans=max(temp,ans);
for(j=i+1;j<=n;j++)
{
ll t1=temp|a[j];
ans=max(t1,ans);
for(int k=j+1;k<=n;k++)
{
ll t2=t1|a[k];
ans=max(ans,t2);
}
}
}
printf("%I64d\n",ans);
return 0;
}
题目:click
题意:问a是否能够通过前缀和后缀交换得到数组b。
看个样例就更明显了,t1 t2 t3 t4 t5 t6,如果我们选择交换的个数为3,可以得到,t4 t5 t6 t1 t2 t3,思路就出来了,无论怎么交换,t4始终对应t3,t1对应t6。直接针对b数组的数组对应模式到a数组中找就可以了。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
const int MAXlen=1e5+10;
long double eps=1e-9;
int a[510],b[510];
int book[510];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(book,0,sizeof(book));
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
if(n&1)
{
if(a[n/2+1]!=b[n/2+1])
{
printf("No\n");
continue;
}
}
bool flag=true;
int yy=n/2;
for(i=1;i<=yy;i++)
{
int t1=b[i];
int t2=b[n-i+1];
bool hh=false;
for(j=1;j<=yy;j++)
{
if(book[j]==0)
{
if(a[j]==t1&&a[n-j+1]==t2)
{
hh=true;
book[j]=1;
book[n-j+1]=1;
break;
}
if(a[j]==t2&&a[n-j+1]==t1)
{
hh=true;
book[j]=1;
book[n-j+1]=1;
break;
}
}
}
if(hh)
{
continue;
}
else
{
flag=false;
break;
}
}
if(flag)
printf("yes\n");
else
printf("No\n");
}
return 0;
}