ccf[201809-4]再賣菜-70分暴力

思路是深搜,然後根據他給的代碼約束可以取的值減小一點複雜度,最後選夠了之後計算並與答案相比較,由於是從一開始搜的,那麼答案一定是字典序最小的,考試的時候打了個這個才30分,現在變成了70分,鬱悶啊...

加上這四十分我就差十分就會編程了..話說這次第三題沒寫,第四題可能是敲錯了?第五題暴力20分..簡直就是敲了一下午的暴力啊,等到大佬們發題解的時候在更新這個題的滿分題解...據說是DP?

下附代碼敲得很凌亂將就着看算了

#include<iostream>

using namespace std;

int ans[301];
int ans1[301];
int select[301];
int n;
int ok=0;

bool check()
{
	for(int i=1;i<=n;i++)
	{
		if(i==1)
		{
			ans1[i]=(select[i]+select[i+1])/2;
		}
		else if(i==n)
		{
			ans1[i]=(select[i]+select[i-1])/2;
		}
		else
		{
			ans1[i]=(select[i]+select[i-1]+select[i+1])/3;
		}
	}
	int flag=1;
	num++;
	for(int i=1;i<=n;i++)
	{
		if(ans[i]!=ans1[i])
		{
			flag=0;
			break;
		}
	}
	return flag;
}

void dfs(int x)
{
	if(ok) return;
	if(x==n+1)
	{
		if(check())
		{
			for(int i=1;i<=n;i++)
				cout<<select[i]<<" ";
			ok=1;
			return;
		}
		return;
	}
	if(x==1)
	{
		for(int i=1;i<=ans[1]*2;i++)
		{
			select[x]=i;
			dfs(x+1);
		}
		return;
	}
	else if(x==2)
	{
		for(int i=ans[1]*2-select[1];i<=ans[1]*2+1-select[1];i++)
		{
			if(i>0)
			{
					select[x]=i;
				dfs(x+1);
			}
		
		}
		return;
	}
	else if(x>2)
	{
		for(int i=ans[x-1]*3-select[x-1]-select[x-2];i<=2+ans[x-1]*3-select[x-1]-select[x-2];i++)
		{
			if(i>0)
			{
				select[x]=i;
			dfs(x+1);
			}
			
		}
		return;
	}
 } 

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>ans[i];
	dfs(1);
	return 0;
 } 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章