solve
- 考虑贪心
- 样例能过但是会掉10个点
- 我们再思考,会发现贪心有坑(hack懒得mo了)
没招了建议爆搜
- 观察题目,发现只会出现0/1两种情况
- 我们手mo所有情况,发现情况呈现一棵树(貌似是二叉树)
- n<=20,直接dfs爆搜就完了
- 代码有点细节,请看
Code
#include<bits/stdc++.h>
using namespace std;
int n;
int a[30];
int ans;
void dfs(double p,int x,int num)
{
if (x == n)
{
if (p>0 && p-a[x]<0) num++;
if (p<0 && p+a[x]>0) num++;
ans=max(num,ans);
return;
}
if (p>0)
{
dfs(p+a[x],x+1,num);
// 先搜,不能吃++的num
if (p-a[x]<0) num++;
dfs(p-a[x],x+1,num);
}
if (p<0)
{
dfs(p-a[x],x+1,num);
// 同理
if (p+a[x]>0) num++;
dfs(p+a[x],x+1,num);
}
}
int main()
{
cin >> n;
for (int i=1;i<=n;i++) cin >> a[i];
dfs(0.5,1,0);
cout << ans << endl;
return 0;
}