• CCF CSP 201809-4 再卖菜


    思路:

    1.设ai是第一天第i家店的菜价,bi是第二天第i家店的菜价;
    2.根据题意有:

    1. a2=2b1-a1+k   (k=0,1)
    2. ai+1=3bi-ai-1-ai+k   (k=0,1,2;1<i<n)
    3. an=2bn-an-1+k   (k=0,1)

    3.我们知道a1是小于等于2b1且大于零的,所以我们可以让a1从1开始dfs到2b1,确定了a1之后,后面的菜价都可以确定(变化的只有k),在深搜的过程中,如果遇到小于1的菜价就return,遍历到最后一个菜价时,需要用第二点的第三个公式进行检验,如果矛盾就return;
    4.在上述dfs中产生了许多重复计算,因此我们采用记忆化搜索,定义数组dp[][][]dp[i][j][k]第一天第i家店的菜价为j且第i+1家店的菜价为k时,是否不能得到合适的结果,每次搜索之前访问一下相应的位置,如果该次不能得到合适结果,改变数组中相应值即可;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define isOp(x,y) ((x^y)<0)
    #define m_p(a,b) make_pair(a,b)
    #define p_b(a) push_back(a)
    #define rp(i,n) for(int i=0;i<n;i++)
    #define rpn(i,n) for(int i=1;i<=n;i++)
    #define l_b(a,n,x) lower_bound(a,a+n,x)-a
    #define u_b(a,n,x) upper_bound(a,a+n,x)-a
    const int MAX_N=301;
    int n;
    int s_2[MAX_N];//第二天的菜价
    int s_1[MAX_N];
    bool dp[MAX_N][MAX_N][MAX_N];
    void dfs(int index,int p){//计算index+1家店第一天菜价
    	if(p<1) return;
    	if(index==n){
    		if(((s_1[n-1]+p)>>1)==s_2[n]) s_1[n]=p;
    		return;
    	}
    	s_1[index]=p;
    	if(index==1){
    		for(int i=0;i<=1;i++){
    			int np=2*s_2[1]-p+i;
    			if(!dp[1][p][np]){
    				dfs(2,np);
    				if(s_1[n]) break;
    				dp[1][p][np]=true;
    			}
    		}
    	}
    	else{
    		for(int i=0;i<=2;i++){
    			int np=3*s_2[index]-s_1[index]-s_1[index-1]+i;
    			if(!dp[index][p][np]){
    				dfs(index+1,np);
    				if(s_1[n]) break;
    				dp[index][p][np]=true;
    			}
    		}		
    	}
    }
    int main(){	
    	cin>>n;
    	rpn(i,n) cin>>s_2[i];
    	for(int i=1;i<=(s_2[1]<<1);i++){
    		dfs(1,i);
    		if(s_1[n]) break;
    	}
    	cout<<s_1[1];
    	for(int i=2;i<=n;i++) cout<<' '<<s_1[i];
    	return 0;
    }
    
  • 相关阅读:
    DBeaver导入SQL脚本数据
    SpringCloudEureka上篇
    SpringCloud基本认知
    问题记录_服务器上环境重启
    应用架构、业务架构、技术架构、业务流程图
    问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会
    BumbleBee: 如丝般顺滑构建、交付和运行 eBPF 程序
    Ubuntu 21.10 安装调试符号
    MysqlCURD
    Linux搭建邮件服务器
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308907.html
Copyright © 2020-2023  润新知