20180901(卖菜)
问题描述
  在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。
  第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。
  注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。
  给定第一天各个商店的菜价,请计算第二天每个商店的菜价。
输入格式
  输入的第一行包含一个整数n,表示商店的数量。
  第二行包含n个整数,依次表示每个商店第一天的菜价。
输出格式
输出一行,包含n个正整数,依次表示每个商店第二天的菜价。
样例输入
8
4 1 3 1 6 5 17 9
样例输出
2 2 1 3 4 9 10 13
数据规模和约定
对于所有评测用例,2 ≤ n ≤ 1000,第一天每个商店的菜价为不超过10000的正整数。
代码1
1  | //freopen("D://input.txt","r",stdin);  | 
20180902(买菜)
代码1
这题也是使用双指针法,假如当前指针指向两个人所在的时间段[a,b]和[c,d],先累加相交叉的时间段,然后应该会有一下几种情况:1. d>b-1,前者指针推进,2. b>d-1,累加相交叉的时间段,后者指针推进,3. 否则,两者指针都推进。
1  | //freopen("D://input.txt","r",stdin);  | 
20180903(元素选择器)



代码1
设计一个struct来表示一行:
1  | struct Line{  | 
这样就可以表示每一行了。然后输入所有行到vector<Line> lines中。对于查询,若查询的是标签或id,就好办了,直接线性遍历匹配;若查询的是后代,则要用到栈,匹配一个祖先就压栈,直到所有祖先都压栈了,然后就看下一层级下有没有对应的,若有,就记录结果,那什么时候弹栈呢?假如你上次压栈的是1层的,这次又到了a层,那就弹栈,直到栈顶的层数比a小或空栈。
1  | //freopen("D://input.txt","r",stdin);  | 
80分。错误。我没有注意到id属性大小写不敏感
测试数据
1  | 11 5  | 
20180904(再卖菜)
问题描述
  在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。
  第一天,每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。
  注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商店n-1,其他编号为i的商店有两个相邻的商店i-1和i+1。
  给定第二天各个商店的菜价,可能存在不同的符合要求的第一天的菜价,请找到符合要求的第一天菜价中字典序最小的一种。
  字典序大小的定义:对于两个不同的价格序列(a1, a2, …, an)和(b1, b2, b3, …, bn),若存在i (i>=1), 使得ai<bi,且对于所有j<i,aj=bj,则认为第一个序列的字典序小于第二个序列。
输入格式
  输入的第一行包含一个整数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的正整数。
  请注意,以上都是给的第二天菜价的范围,第一天菜价可能会超过此范围。
代码1
设置第一天菜价为prices1, 第二天菜价为prices2。因为prices2[0]=2,所以prices1[0]+prices1[1]的取值范围只能是[2*2, 3*2-1],也就是[4,5];因为prices2[1]=2,所以prices1[0]+prices1[1]+prices1[2]的取值范围是[2*3,3*3-1],也就是[6, 8];后面的以此类推。用vector<array<int>> scopes 保存每2/3天的菜价总和范围,scopes[0]表示第0和1天的,scopes[1]表示第0,1,2天的,scopes[n-1]表示第n-2, n-1天的。
我们采用dfs的方法,以题目给的样例为例,首先在第一天的时候,遍历每种可能的情况[1,4],然后第二天根据第一天的取值,遍历每种可能的情况,第三天也是……。若中间出现有一天,不能取到合法的值的时候,就是要回溯的时候。若顺利地进行到了最后一天,那么这个结果就是最终结果。
1  | //freopen("D://input.txt","r",stdin);  | 
80分。运行超时
		








































