CCF再卖菜 java

题目:
问题描述
试题编号: 201809-4
试题名称: 再卖菜
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。
  第一天,每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。
  注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。
  给定第二天各个商店的菜价,可能存在不同的符合要求的第一天的菜价,请找到符合要求的第一天菜价中字典序最小的一种。
  字典序大小的定义:对于两个不同的价格序列(a1, a2, …, an)和(b1, b2, b3, …, bn),若存在i (i>=1), 使得ai 输入格式
  输入的第一行包含一个整数n,表示商店的数量。
  第二行包含n个正整数,依次表示每个商店第二天的菜价。
输出格式
  输出一行,包含n个正整数,依次表示每个商店第一天的菜价。
样例输入
8
2 2 1 3 4 9 10 13
样例输出
2 2 2 1 6 5 16 10
数据规模和约定
  对于30%的评测用例,2<=n<=5,第二天每个商店的菜价为不超过10的正整数;
  对于60%的评测用例,2<=n<=20,第二天每个商店的菜价为不超过100的正整数;
  对于所有评测用例,2<=n<=300,第二天每个商店的菜价为不超过100的正整数。
  请注意,以上都是给的第二天菜价的范围,第一天菜价可能会超过此范围。

刚看到题,讲道理听懵逼的,想到了用dfs来做,但是思路不清晰,没法下手,后来看到了网上大神的思路,自己跟着尝试了一下,做出来了,这题解题思路有两个,

一个是用dfs+记忆化搜索来做,一个是用差分约束系统结合最短路径来做,尴尬,因为我是在是太菜了,差分约束系统貌似不太熟悉,(太菜了),这里先贴出dfs的做法,待我学一波差分约束系统再来把代码补上
dfs的思路:写下来算是以后提醒自己,以后只要能求出递推公式的题都能用dfs来做,对于此题,公式是很明显的:我们设已知第二天的各个店家的菜价为 a[n],第一天未知的店家菜价为b[n],n为店家个数,那么我们有 (b[n]+b[n+1]+b[n-1])/3 == a[n] 可以得到递推公式b[n+1]=3a[n]-b[n]-b[n-1] 或b[n+1]=3a[n]-b[n]-b[n-1]+1或b[n+1]=3a[n]-b[n]-b[n-1]+2对于首尾两天,要分别判断***

package CCF第四题;
import java.util.Scanner;
public class 再卖菜 {
	static int n;
	static int[]a;
	static int[]b;
	static boolean[][][]flag; //记忆化搜索,用来标记dfs的t,x,y
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		 n = in.nextInt();
		 a = new int[400]; //输入菜价
		 b = new int[400]; //待求菜价
		 flag = new boolean[400][400][400];
		for (int i = 1; i <=n; i++) {
			a[i] = in.nextInt();
		}
		for (int i = 1; i <2*a[1]; i++) {
			b[1] = i;b[2] = 2*a[1]-i;  //第一种情况
			dfs(2,b[1],b[2]); //已知 b[n],b[n-1],求b[n+1]
			b[1] = i;b[2] = 2*a[1]-i+1;  //第二种情况
			dfs(2,b[1],b[2]); //已知 b[n],b[n-1],求b[n+1]
		}
	}
	private static void dfs(int t, int x, int y) {
		if(flag[t][x][y])
			return;
		flag[t][x][y] = true;
		if(t== n-1){ //处理最后一天
			for (int i = 0; i < 3; i++) {
				if(3*a[t]-x-y+i >= 1 && (3*a[t]-x-y+i+y)/2 == a[n] ){//最后一天符合要求
					for (int j = 1; j = 1)
			dfs(t+1, y, b[t+1]);
		}
	}
}

你可能感兴趣的:(CCF应试)