ccf 201809-4 再賣菜 java 100分
阿新 • • 發佈:2019-01-07
import java.util.Scanner;
public class c20180904 {
static int total;
static int []first;
static int []second;
static boolean [][][]visit;
static void dfs(int n,int x,int y){
if(visit[n][x][y])return;//剪枝,不加只有80分
visit[n][x][y]=true;
if(n==total-1){
if((3*second[n]-x)/2==second[total]||(3 *second[n]-x+1)/2==second[total]||(3*second[n]-x+2)/2==second[total]){ //最後一天菜價
for(int i=1;i<=n;++i) //輸出
System.out.print(first[i]+" ");
for(int i=0;i<3;++i)
{
if((3*second[n]-x+i)/2==second[total]) //輸出最後一天菜價
{
System.out.print(3*second[n]-x-y+i+" ");
System. exit(0);//終止
}
}
}
return;
}
for(int i =0;i<3;i++){
first[n+1]=3*second[n]-x-y+i;
if(first[n+1]>0){
dfs(n+1,y,first[n+1]);
}
}
}
public static void main(String []args){
Scanner sc = new Scanner(System.in);
total = sc.nextInt();
second = new int[400];
first = new int[400];
visit = new boolean[301][301][301];
for(int i =1;i<=total;i++){
second[i] = sc.nextInt();
}
for(int i=1;i<=2*second[1];i++)
{
first[1]=i;
first[2]=2*second[1]-i; //第一天菜價,有兩種可能
dfs(2,first[1],first[2]);
first[1]=i;
first[2]=2*second[1]-i+1; //第二種可能
dfs(2,first[1],first[2]);
}
}
}