P2326 AKN’s PPAP

时间:2023-12-29 08:28:50

P2326 AKN’s PPAP
比较裸的贪心
从高位向下枚举,如果当前位为1的个数大于1,ans+=(1<<i),然后从这些数中再向下枚举。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()
//by war
//2017.10.25
using namespace std;
int n;
int ans;
queue<int>q[];
int t;
int a[];
int cnt;
int temp[];
int T;
void in(int &x)
{
int y=;
char c=g();x=;
while(c<''||c>'')
{
if(c=='-')
y=-;
c=g();
}
while(c<=''&&c>='')x=x*+c-'',c=g();
x*=y;
}
void o(int x)
{
if(x<)
{
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} void bl(int now)
{
//ÓÃÊý×éÀ´´æ
int top;
cnt=;
while(q[now+].size()>)
{
top=q[now+].front();
/*if((top>>i)&1==1)
q[i].push(top);*/
q[now+].pop();
temp[++cnt]=top;
}
for(register int i=now;i>=;i--)
{
For(j,,cnt)
if((temp[j]>>i)&==)
q[i].push(temp[j]);
if(q[i].size()>)
{
ans+=(<<i);
if(i>)
bl(i-);
break;
}
}
} int main()
{
in(t);
T=t;
while(t--)
{
ans=;
in(n);
For(i,,n)
in(a[i]);
for(register int i=;i>=;i--)
{
For(j,,n)
if((a[j]>>i)&==)
q[i].push(a[j]);
if(q[i].size()>)
{
ans+=(<<i);
if(i>)
bl(i-);
break;
}
}
printf("Case #%d: %d ",T-t,ans);
p('\n');//o(ans),
For(i,,)
while(q[i].size()>)
q[i].pop(); } return ;
}