ブルーブリッジカップ全国大会準備DAY7

ここにポイントがあります

dp + dfs +線分ツリー+ツリーのような配列+チェックセット+完全な配置+グラフ理論


第10回ブルーブリッジカップjavaBグループ全国大会の質問

回答:839542176

#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<<<<rrrr<<endl;

    cout<<endl;
    
    return 0;
}

A :(第10回ブルーブリッジカップC ++ Bグループ全国大会の質問)

7020

#include<iostream>


using namespace std;

/*

1、2019<X<Y
2、2019^2, X^2, Y^2构成等差数列
满足条件的X和Y可能有多种情况,请给出X+Y的值,并且令X+Y尽可能的小。
*/ 

long long a,b; 


int main(){
    
    
	int flag=0;
    for(int i=2020;;i++){
    
    
    	for(int j=i+1;j*j-i*i <=  i*i-2019*2019;j++){
    
    
    		if(j*j-i*i ==  i*i-2019*2019){
    
    
    			cout<<i+j<<endl;
    			flag=1;
				break;
    		}
    	}
    	if(flag)break;
    }
    return 0;
}

E :(第10回ブルーブリッジカップC ++ Bグループ全国大会の質問)

除数が1の最小数は1(1)で、除数が2の最小数は2(1,2)です...
除数がnの最小数はSn
S1 = 1(1)
S2 = 2(1 2)です。
S3 = 4(1 2 4)
S4 = 6(1 2 3 6)
S100を見つける

回答:45360

#include<iostream>


using namespace std;

int res;
int rescur;

void cnt(int x){
    
    
    rescur=0;
    for(int i=1;i<=x;i++){
    
    
        if(x%i==0)  rescur++;
    }
}

int main(){
    
    
    for(int i=1;;i++){
    
    
        cnt(i);
        if(rescur>res)  res=rescur;
        if(res==100){
    
    
            cout<<i<<endl;
            break;
        }
    }
    return 0;
}

D :(第10回ブルーブリッジカップC ++ B全国大会の質問)
7X7の正方形があります。グリッドの左上隅の頂点の座標は(0,0)で、右下隅の座標は(7,7)です。
次の条件を満たすパスの数を見つけ
ます。1。開始ポイントとエンドポイントは両方とも(0,0)です
。2。パスはそれ自体と交差しません。3
。、パスの長さは12以下です
。4。各頂点には、上、下、左、および4つの方向があります。右ですが、境界を越えることはできません

回答:206

#include<iostream>

using namespace std;
/*
8*8矩阵
左上角A是0,0 
从A 走到A 按照上下左右走
小于等于12的路径数
走过不能再走
*/

const int N=8;

int arr[N][N];
int v[N][N];
int res;

void dfs(int x, int y,int len){
    
    
    if(len>12) return;
    if(x==0 && y==0){
    
    
        res++;
        return;
    }
    
    
    if(x+1<N && !v[x+1][y]){
    
    
        v[x+1][y]=1;
        dfs(x+1,y,len+1);
        v[x+1][y]=0;
    }
    
    if(y+1<N && !v[x][y+1]){
    
    
        v[x][y+1]=1;
        dfs(x,y+1,len+1);
        v[x][y+1]=0;
    }
    
    if(x-1>=0 && !v[x-1][y]){
    
    
        v[x-1][y]=1;
        dfs(x-1,y,len+1);
        v[x-1][y]=0;
    }
    
    if(y-1>=0 && !v[x][y-1]){
    
    
        v[x][y-1]=1;
        dfs(x,y-1,len+1);
        v[x][y-1]=0;
    }
}

int main(){
    
    
    v[1][0]=1;
    dfs(1,0,1);
    v[1][0]=0;
    
     v[0][1]=1;
     dfs(0,1,1);
     v[0][1]=0;
    
    cout<<res-2<<endl;
    return 0;
}

おすすめ

転載: blog.csdn.net/BOWWOB/article/details/109468289