思路是深搜,然後根據他給的代碼約束可以取的值減小一點複雜度,最後選夠了之後計算並與答案相比較,由於是從一開始搜的,那麼答案一定是字典序最小的,考試的時候打了個這個才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;
}