180904 再卖菜 ccf
生活随笔
收集整理的这篇文章主要介绍了
180904 再卖菜 ccf
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
思路
dfs+去重
关键
满分的关键在于不同的前缀可能会遇到相同的情况,要直接排除这些情况,避免重复计算(单纯dfs只有80分)
实现
这里采用数组f来记录各种情况,通过traceback函数回溯
1 #include<iostream>2 #include<cstring>3 4 using namespace std;5 6 int a[305];7 int b[305];8 bool f[305][305][305];//去重9 //int s=0; 10 int n; 11 void traceback(int i,int b1,int b2){ 12 /*if(s==1){ 13 return; 14 }*/ 15 if(f[i][b1][b2])return; 16 f[i][b1][b2]=true; 17 if(i>=n){ 18 if((b1+b2)/2==a[n-1]){ 19 for(int j=0;j<n;j++){ 20 cout<<b[j]<<' '; 21 } 22 exit(0); 23 } 24 25 } 26 else{ 27 for(int j=0;j<3;j++){//考虑除法取整的情况 28 b[i]=a[i-1]*3+j-b2-b1; 29 if(b[i]<=0){ 30 continue; 31 } 32 traceback(i+1,b[i],b[i-1]); 33 /*if(s==1){ 34 return; 35 }*/ 36 } 37 } 38 return; 39 } 40 41 int main(){ 42 memset(f,false,sizeof(f)); 43 cin>>n; 44 for(int i=0;i<n;i++){ 45 cin>>a[i]; 46 } 47 48 int lim=2*a[0]; 49 for(int i=1;i<=lim;i++){ 50 b[0]=i; 51 for(int j=0;j<2;j++){//考虑除法取整的情况 52 b[1]=lim+j-b[0]; 53 if(b[1]<=0){ 54 continue; 55 } 56 traceback(2,b[1],b[0]); 57 /*if(s==1){ 58 return 0; 59 }*/ 60 } 61 } 62 63 return 0; 64 }
题目
问题描述 在一条街上有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的正整数。
请注意,以上都是给的第二天菜价的范围,第一天菜价可能会超过此范围。
转载于:https://www.cnblogs.com/Gru-blog/p/11260539.html
总结
以上是生活随笔为你收集整理的180904 再卖菜 ccf的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Spring常问的面试
- 下一篇: 上某些网站的时候要小心,不要以为 HTT