一、题目
问题描述
试题编号: | 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的正整数; |
二、思路
利用深度优先搜索算法,依次假设开始的第一天和第二天的价格。
三、代码
代码超时 80分。
import java.util.*;
public class Main{
static int[] yes;
static int[] now;
static int num;
// static boolean flag=false;
public static void main(String[] args){
Scanner in=new Scanner(System.in);
num=in.nextInt();
now=new int[num+1];
yes=new int[num+1];
for(int i=1;i<=num;i++){
now[i]=in.nextInt();
}
for(int i=1;i<2*now[1];i++){
yes[1]=i;
yes[2]=2*now[1]-i;
dfs(2);
yes[2]=2*now[1]-i+1;
dfs(2);
}
}
static boolean check(){
if(((yes[1]+yes[2])/2!=now[1])||(yes[num-1]+yes[num])/2!=now[num])
return false;
for(int i=2;i<num;i++){
if((yes[i-1]+yes[i]+yes[i+1])/3!=now[i]) return false;
}
System.out.print(yes[1]);
for(int i=2;i<=num;i++)
System.out.print(" "+yes[i]);
System.out.println();
return true;
}
static void dfs(int day){
if(yes[day]<1) return;
if(day==num){
if(check())System.exit(0);
return;
}
if(day==num-1){
yes[day+1]=2*now[day+1]-yes[day];
dfs(num);
yes[day+1]=2*now[day+1]-yes[day]+1;
dfs(num);
}
for(int i=0;i<3;i++){
yes[day+1]=3*now[day]-yes[day]-yes[day-1]+i;
dfs(day+1);
}
}
}