蓝桥杯国赛备赛DAY5

记忆化dp ,区间dp , 线段树, 树状数组, 并查集练习题。

区间dp:
1.石子合并
2.密码脱落

并查集:
1.合并集合
2.连通块中点的数量
3.食物链
4.村庄通电(最小生成树)

记忆化dp:
1.滑雪
2.矩阵中的最长递增路径

树状数组,线段树:
0.子矩阵前缀和
1.前缀和
2.动态求连续区间和
2.数星星

2018年第九届蓝桥杯Java程序设计本科B组决赛个人题解汇总:
第二题
标题:最大乘积

把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。

比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)

全排列

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cmath>
#include<set>
#include<algorithm>
#include<sstream>
using namespace std;

int a[9]={
    
    1,2,3,4,5,6,7,8,9};
int t[9];
long long rrrr;
int l_range,r_range;
int main(){
    
    
	do{
    
    
        for(int i=0;i<=7;i++){
    
    
            int ln=i+1,rn=9-ln;
            
            long long rl=0;
            long long rr=0;
            long long rres=0;
            string s;
            string s1,s2; 
            
			for(int j=0;j<=i;j++){
    
    
				stringstream sb;
				sb<<a[j];				
				s1+=sb.str();
			} 
			for(int k=i+1;k<=8;k++){
    
    
				stringstream sb;
				sb<<a[k];
				
				s2+=sb.str();
			}

			stringstream sa1,sa2;
			sa1<<s1;
			sa1>>rl;
			sa2<<s2;	
			sa2>>rr; 

            rres=rl*rr;
            stringstream ssb;
            ssb<<rres;
            s=ssb.str();

            set<char> st;
            int flag=0;
            for(int u=0;u<s.size();u++){
    
    
            	if(s[u]=='0'){
    
    
            		flag=1;
            		break;
            	}
                st.insert(s[u]);
            }
            if(flag){
    
    
            	continue;
            }
            if(st.size()==s.size() && rres>rrrr){
    
    
            	l_range=rl;
            	r_range=rr;
            	for(int i=0;i<=8;i++){
    
    
            		t[i]=a[i];
            	}
                rrrr=rres;
            }
        }
    }while(next_permutation(a,a+9));
    cout<<"??1:"<<l_range<<endl;
    cout<<"??2:"<<r_range<<endl;
    cout<<"结果:"<<rrrr<<endl;
    cout<<endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/BOWWOB/article/details/109365466