ここにポイントがあります
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;
}