2016年蓝桥杯
2020-04-05 18:24
274 查看
#四数平方和
1.巧妙枚举
#include<iostream> #include<map> #include<cmath> using namespace std; int N; map<int,int>cache; int main(){ cin>>N; for(int c=0;c*c<=N/2;c++){ for(int d=c;c*c+d*d<=N;d++){ if(cache.find(c*c+d*d)==cache.end()) cache[c*c+d*d]=c; } } for(int a=0;a*a<=N/4;a++){ for(int b=a;a*a+b*b<=N/2;b++){ if(cache.find(N-a*a-b*b)!=cache.end()){ int c=cache[N-a*a-b*b]; int d=int(sqrt(N-a*a-b*b-c*c)); cout<<a<<" "<<b<<" "<<c<<" "<<d; return 0; } } } }
#寒假作业
1.全排列加检查
#include<iostream> using namespace std; int ans; int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; bool check(){ if(a[0]+a[1]==a[2]&& a[3]-a[4]==a[5]&& a[6]*a[7]==a[8]&& a[9]%a[10]==0&& a[9]/a[10]==a[11]) return true; return false; } //全排列 void f(int k){ if(k==13){ if(check()) ans++; } for(int i=k;i<13;i++){ {int t=a[i];a[i]=a[k];a[k]=t;} /* if((k==2&&a[0]+a[1]!=a[2])||(k==5&&a[3]-a[4]!=a[5])){ {int t=a[i];a[i]=a[k];a[k]=t;} continue;}*/ f(k+1); {int t=a[i];a[i]=a[k];a[k]=t;} } } int main(){ f(0); cout<<ans; return 0; }
#方格填数
1.全排列加检查
#include<iostream>//全排列+检查 #include<cmath> using namespace std; int a[10]={0,1,2,3,4,5,6,7,8,9}; int ans; bool check(){ if(abs(a[0]-a[1])==1|| abs(a[0]-a[3])==1|| abs(a[0]-a[4])==1|| abs(a[0]-a[5])==1|| // abs(a[1]-a[2])==1|| abs(a[1]-a[4])==1|| abs(a[1]-a[5])==1|| abs(a[1]-a[6])==1|| // abs(a[2]-a[5])==1|| abs(a[2]-a[6])==1|| // abs(a[3]-a[4])==1|| abs(a[3]-a[7])==1|| abs(a[3]-a[8])==1|| // abs(a[4]-a[5])==1|| abs(a[4]-a[7])==1|| abs(a[4]-a[8])==1|| abs(a[4]-a[9])==1|| // abs(a[5]-a[6])==1|| abs(a[5]-a[8])==1|| abs(a[5]-a[9])==1|| // abs(a[6]-a[9])==1|| // abs(a[7]-a[8])==1|| // abs(a[8]-a[9])==1) return false; return true; } //考虑第k个位置一般从零开始 void f(int k){ if(k==10){ bool b=check(); if(b) ans++; return; } //尝试将位置i与位置k交换 for(int i=k;i<10;i++){ { int t=a[i]; a[i]=a[k]; a[k]=t; } f(k+1); { int t=a[i]; a[i]=a[k]; a[k]=t; } } } int main(){ f(0); cout<<ans<<endl; return 0; }
把空位补齐检查
#include<iostream> #include<cmath> using namespace std; int a[5][6]; int vis[10]; int ans; bool check(int i,int j,int a[][6]){ for(int x=i-1;x<=i+1;x++) for(int y=j-1;y<=j+1;y++){ //cout<<a[x][y] if(abs(a[x][y]-a[i][j])==1){ //cout<<a[x][y]<<" "<<a[i][j]<<endl; return false;}} return true; } void f(int x,int y,int a[][6]){ //cout<<x<<" "<<y<<endl; if(x==3&&y==4){ ans++; return; } //从0到9抓一个 for(int i=0;i<10;i++){ //cout<<i<<endl; if(vis[i]==0) { a[x][y]=i; //cout<<a[x][y]<<endl; if(!check(x,y,a)){ a[x][y]=-10; // cout<<a[x][y]<<endl; continue; } vis[i]=1; if(y==4)//到达右界换行 f(x+1,1,a); else f(x,y+1,a); { vis[i]=0; a[x][y]=-10;} } } } inti(){ for(int i=0;i<5;i++) for(int j=0;j<6;j++) { a[i][j]=-10; //cout<<a[i][j]<<endl; } } int main(){ inti(); f(1,2,a); cout<<ans<<endl; return 0; }
#剪邮票
1.全排列
2连通性检测
#include<iostream> #include<algorithm> #include<errno.h> using namespace std; int a[12]={0,0,0,0,0,0,0,1,1,1,1,1}; int ans; void dfs(int g[][4],int i,int j){ g[i][j]=0; if(i-1>=0&&g[i-1][j]==1) dfs(g,i-1,j); if(i+1<=2&&g[i+1][j]==1) dfs(g,i+1,j); if(j-1>=0&&g[i][j-1]==1) dfs(g,i,j-1); if(j+1<=3&&g[i][j+1]==1) dfs(g,i,j+1); } bool check(){ int g[3][4]; for(int i=0;i<3;i++){ for(int j=0;j<4;j++){ if(a[i*4+j]==1) g[i][j]=1; else g[i][j]=0; } } //连通检测 int cnt=0; for(int i=0;i<3;i++) for(int j=0;j<4;j++) if(g[i][j]==1){ dfs(g,i,j); cnt++; } return cnt==1; } /*void f(int k){ if(k==12){ if(check()) ans++; } for(int i=k;i<12;i++){ {int t=a[i];a[i]=a[k];a[k]=t;} f(k+1); {int t=a[i];a[i]=a[k];a[k]=t;} } }*/ int main(){ do{ if(check()) ans++; }while(next_permutation(a,a+12)); cout<<ans; return 0; }
#密码脱落 1.深搜比较 2.时间较长 ```cpp #include<iostream> #include<cstring> using namespace std; char s[10000]; int dfs(char *s,int left,int right,int cnt){ if(left>=right) return cnt; if(*(s+left)!=*(s+right))//两端不等 return min(dfs(s,left+1,right,cnt+1),dfs(s,left,right-1,cnt+1)); else return dfs(s,left+1,right-1,cnt); } int main(){ cin>>s; int len=strlen(s); int ans=dfs(s,0,len-1,0); cout<<ans; return 0; }
1.最长公共子序列
2。动归
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; char s[10000]; char *rev(char *s){ int len=strlen(s); char *ans=(char *)malloc(sizeof(s));//memory allocation,中文叫动态内存分配 for(int i=0;i<len;i++) ans[i]=s[len-1-i]; //cout<<ans; return ans; } //最长公共序列 void lcs(char *s1,char *s2){ int len=strlen(s1); int dp[100][100]; //初始化第一行 for(int i=0;i<len;i++){ if(s1[i]==s2[0]) dp[0][i]=1; else dp[0][i]= i==0?0:dp[0][i-1]; } for(int j=0;j<len;j++){ if(s2[j]==s1[0]) dp[j][0]=1; else dp[j][0]= j==0?0:dp[j-1][0]; } for(int i=1;i<len;i++) for(int j=1;j<len;j++){ if(s2[i]==s1[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } cout<<len-dp[len-1][len-1]; //return dp[len-1][len-1]; } int main(){ cin>>s; int len=strlen(s); lcs(s,rev(s)); //cout<<lcs(s,rev(s)); //cout<<ans; return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 2016年蓝桥杯C++/c B组答案
- 剪邮票(2016年蓝桥杯)
- 2016年蓝桥杯比赛心得
- 2016年蓝桥杯A组 寒假作业(暴力枚举||dfs)
- 2016年蓝桥杯决赛第二题凑平方数
- 【蓝桥杯】2016年第七届蓝桥杯大赛个人赛省赛(软件类)真题-Java语言B组(未完)
- 2016年蓝桥杯A组第三题 方格填数
- 2016年蓝桥杯决赛 奇怪的数列
- 【蓝桥杯】2016年第七届蓝桥杯省赛真题-Java语言B组-5-抽签
- 2016年蓝桥杯 —— 第六题
- 蓝桥杯-【2016年省赛B组题解省赛总目录】【C++】
- 2016年蓝桥杯A组 剪邮票(dfs)
- 【蓝桥杯】2016年第七届蓝桥杯省赛真题-Java语言B组-3-凑算式
- 2016年第七届蓝桥杯javaB组 试题 答案 解析
- 蓝桥杯-【方格填数】【2016年省赛B组题解】【C++】——暴力破解
- 2016年蓝桥杯B组预赛个人解析
- 2016年第七届蓝桥杯试题(C/C++本科B组)
- 2016年蓝桥杯解析--有奖猜谜(java)
- 煤球数目(2016年第七届蓝桥杯c/c++省赛B组(1题))
- 2016年第七届蓝桥杯省赛(C/C++ A组)