试题编号: | 201809-4 |
试题名称: | 再卖菜 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 输入格式 输入的第一行包含一个整数n,表示商店的数量。 输出格式 输出一行,包含n个正整数,依次表示每个商店第一天的菜价。 样例输入 8 样例输出 2 2 2 1 6 5 16 10 数据规模和约定 对于30%的评测用例,2<=n<=5,第二天每个商店的菜价为不超过10的正整数; |
#include<iostream>
using namespace std;
int n,num[305],ans[305];//num表示输入,ans表示结果
int vis[305][305][305]={0};//三维数组标记,分别标记商店,该商店的菜价,该商店前一家的商店
int DFS(int u,int v,int w){
if(vis[u][v][w]==1)return 0;//如果这种局面已经出现过,说明这种情况不会有结果,直接返回
vis[u][v][w]=1;//标记该情况
if(u==0){//若是第一家,只有一家相邻的
for(int i=1;i<=num[0]*2;i++){//从1到num[0]*2遍历并递归
ans[0]=i;
DFS(1,ans[0],0);
}
}else if(u==1){//若是第二家,依次尝试令ans[u]=num[0]*2-ans[0] +0,+1
for(int i=0;i<2;i++){
ans[u]=num[0]*2-ans[0]+i;
if(ans[u]>0)DFS(2,ans[u],ans[u-1]);
}
}else if(u>1 && u<n-1){// 依次尝试令ans[u]=num[u-1]*3-ans[u-1]-ans[u-2] +0,+1,+2
for(int i=0;i<3;i++){
ans[u]=num[u-1]*3-ans[u-1]-ans[u-2]+i;
if(ans[u]>0)DFS(u+1,ans[u],ans[u-1]);
}
}else if(u==n-1){//最后一家要满足前一家的条件也要使自己满足条件
for(int i=0;i<3;i++){
ans[u]=num[u-1]*3-ans[u-1]-ans[u-2]+i;
if(ans[u]>0 && (ans[u]+ans[u-1])/2==num[u]){
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
exit(0);
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
}
DFS(0,0,0);
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答