重点来了
dp+dfs+线段树+树状数组+并查集+全排列+图论
第十届蓝桥杯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:(第十届蓝桥杯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:(第十届蓝桥杯C++B组国赛题)
有1个约数的最小数为1(1),有两个约数的最小数为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:(第十届蓝桥杯C++B组国赛题)
有一个7X7的方格。方格左上角顶点坐标为(0,0),右下角坐标为(7,7)
求满足下列条件的路径条数:
1、起点和终点都是(0,0)
2、路径不自交
3、路径长度不大于12
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;
}