AtCoder Beginner Contest 453 C - Sneaking Glances 题解

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;
}
posted @ 2026-04-11 21:54  msjing  阅读(52)  评论(0)    收藏  举报