您的位置:首页 > 其它

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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
小熊迪帝 发布了12 篇原创文章 · 获赞 0 · 访问量 173 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: