题目链接:C. Baby Ehab Partitions Again
题解
用dp判断一开始是否需要删除数字,如果需要,我们只需删除转化为二进制最低位为1的那个数即可。
貌似许多人2e9的时间复杂度也能过,就离谱。
代码
int a[maxn],sum;
int dp[maxm];
int book[maxn],n;
vector<int> p;
bool f()
{
memset(dp, 0, sizeof(dp));
p.clear();
sum=0;
dp[0]=1;
for(int i=1;i<=n;i++)
{
if(!book[i])
{
sum+=a[i];
p.push_back(a[i]);
}
}
if(sum%2) return false;
int tar=sum/2;
for(int i=0;i<p.size();i++)
for(int j=tar;j>=p[i];j--)
dp[j]=dp[j]|dp[j-p[i]];
return dp[tar];
}
int main()
{
cin >> n;
sum=0;
for(int i=1;i<=n;i++) cin >> a[i];
if(!f())
{
cout << 0 << endl;
return 0;
}
cout << 1 << endl;
int minn=inf,ans=0;
for(int i=1;i<=n;i++)
{
int x=a[i];
int cnt=0;
while (x) {
if(x%2) break;
cnt++;
x/=2;
}
if(cnt<minn)
{
minn=cnt;
ans=i;
}
}
cout << ans << endl;
}
/*
100
2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 1000 1000
*/