题目地址:http://oj.ecustacm.cn/viewnews.php?id=1021

目录

  • 四平方和【二分 / 预处理】
  • 煤球数目【递推】
  • 凑算式【全排列】
  • 平方怪圈【打表找规律】
  • 冰雹数【枚举 / 预处理】
  • 搭积木【全排列】
  • 有奖猜谜【模拟】
  • 生日蜡烛【枚举】
  • 方格填数【全排列】
  • 剪邮票【组合数 连通块】
  • 交换瓶子【找环】
  • 寒假作业【全排列】
  • 报纸页数【找规律】
  • 卡片换位【BFS】
  • 最大比例【gcd 辗转相减法】
  • 网友年龄【枚举】

四平方和【二分 / 预处理】


解析:

可以很容易的想到用4层的for暴力。这样一定会超时。
那么问题就是减少for的层数。
我们可以处理两层的for,这样就减少了两维,然后用二分进行查找即可。

#include<bits/stdc++.h>
using namespace std;
struct node{int a,b,c;};
bool cmp(node a,node b)
{if(a.c==b.c) return a.a<b.a;return a.c<b.c;
}
vector<node>ve;
int n;
int main(void)
{for(int i=0;i<=2300;i++)//预处理for(int j=i;j<=2300;j++) ve.push_back({i,j,i*i+j*j});sort(ve.begin(),ve.end(),cmp);while(cin>>n){int flag=0;for(int i=0;i*i<=n;i++){for(int j=i;j*j+i*i<=n;j++){int temp=n-i*i-j*j;int l=0,r=ve.size()-1;while(l<r)//二分{int mid=l+r>>1;if(ve[mid].c>=temp) r=mid;else l=mid+1;}if(ve[l].c==temp)//找到了{cout<<i<<" "<<j<<" "<<ve[l].a<<" "<<ve[l].b<<'\n';flag=1;}if(flag) break;}if(flag) break;}}return 0;
}

煤球数目【递推】

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL sum=0;
int main(void)
{for(int i=1,j=1,k=1;i<=100;i++,j=j+k) sum+=j,k++;cout<<sum;return 0;
}

凑算式【全排列】

#include<bits/stdc++.h>
using namespace std;
int s[10],cnt;
int main(void)
{for(int i=0;i<9;i++) s[i]=i+1;do{double a=s[0],b=s[1],c=s[2];double d=s[3]*100+s[4]*10+s[5];double e=s[6]*100+s[7]*10+s[8];if(a+b/c+d/e==10) cnt++;}while(next_permutation(s,s+9));cout<<cnt;return 0;
}

平方怪圈【打表找规律】


其实不要慌,按照题目模拟就好了。
你可以按照题目写个程序,然后随意的输入一个起始值,你会发现无论你输入的是啥,最后一定会有一个循环的圈。
然后输出这个圈的最大值即可。

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int n,ans;
int main(void)
{/*cin>>n;ans=n;while(1){mp[n]++;string s=to_string(n);cout<<n<<endl;n=0;for(int i=0;i<s.size();i++) n+=(s[i]-'0')*(s[i]-'0');ans=max(ans,n);if(mp[n]) {//cout<<"********";cout<<n<<endl;break;}}//cout<<ans;*/cout<<145;return 0;
}

冰雹数【枚举 / 预处理】


题目的意思就是 1-n中所有的数按照上面的步骤,求其中最大的值。
直接对于每次的输入,我们暴力的按照上面的步骤执行一定会超时。那么我们可以处理里所有的结果。
对于每次查询,O(1)的输出即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e6+10;
LL a[N];
void init()
{map<LL,int>mp;for(int i=1;i<N;i++){LL temp=i,cnt=1;while(temp!=1&&!mp[temp]){mp[temp]++;if(temp&1) temp=temp*3+1;else temp/=2;cnt=max(cnt,temp);}a[i]=cnt;}for(int i=1;i<N;i++) a[i]=max(a[i],a[i-1]);
}
int main(void)
{init();int n; while(cin>>n) cout<<a[n]<<endl; return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
map<LL,LL>mp;
LL n;
LL dfs(LL u)
{if(mp[u]) return mp[u];if(u==1) return 1;if(u&1) return mp[u]=max(u*3+1,dfs(u*3+1));else return mp[u]=dfs(u/2);
}
int main(void)
{while(cin>>n){LL ans=n;for(int i=1;i<=n;i++) ans=max(ans,dfs(i));cout<<ans<<endl;}return 0;
}

搭积木【全排列】

#include<bits/stdc++.h>
using namespace std;
int a[10],cnt;
int main(void)
{for(int i=0;i<10;i++) a[i]=i;do{bool flag=1;if(a[3]>a[6]||a[3]>a[7]) flag=0;if(a[4]>a[7]||a[4]>a[8]) flag=0;if(a[5]>a[8]||a[5]>a[9]) flag=0;if(a[1]>a[3]||a[1]>a[4]) flag=0;if(a[2]>a[4]||a[2]>a[5]) flag=0;if(a[0]>a[1]||a[0]>a[2]) flag=0;if(flag) cnt++;}while(next_permutation(a,a+10));cout<<cnt; return 0;
}

有奖猜谜【模拟】

#include<bits/stdc++.h>
using namespace std;
int cnt=777;
string s="vxvxvxvxvxvxvvx";
int main(void)
{for(int i=0;i<s.size();i++) if(s[i]=='v') cnt=cnt*2;else cnt=max(0,cnt-555);cout<<cnt; return 0;
}

生日蜡烛【枚举】

#include<bits/stdc++.h>
using namespace std;
int main(void)
{for(int i=0;i<=100;i++){int sum=0;for(int j=i;sum<236;j++) sum+=j;if(sum==236) {cout<<i;break;}}return 0;
}

方格填数【全排列】

#include<bits/stdc++.h>
using namespace std;
int a[15],cnt;
bool f(int x,int y)
{int t=abs(a[x]-a[y]);if(t==1) return true;return false;
}
int main(void)
{for(int i=0;i<10;i++) a[i]=i;do{bool flag=1;if(f(0,1) || f(0,3) || f(0,4) || f(0,5) ) flag=0;if(f(1,2) || f(1,4) || f(1,5) || f(1,6)) flag=0;if(f(2,5) || f(2,6)) flag=0;if(f(3,4) || f(3,7) || f(3,8)) flag=0;if(f(4,5) || f(4,7) || f(4,8) || f(4,9)) flag=0;if(f(5,6) || f(5,8) || f(5,9))  flag=0;if(f(6,9)) flag=0;if(f(7,8)) flag=0;if(f(8,9)) flag=0;if(flag) cnt++;}while(next_permutation(a,a+10));cout<<cnt;return 0;
}

剪邮票【组合数 连通块】


首先,我们思考一下如何枚举,本质就是12个数里选5个数。然后判断这5个数在不在同一个联通块里。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int a[15],st[15],cnt;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
bool check()
{vector<pii>ve;map<pii,int>mp;queue<pii>q; q.push({a[0]/4,a[0]%4});while(q.size()){auto temp=q.front(); q.pop();mp[temp]++;int x=temp.first,y=temp.second;for(int i=0;i<4;i++){int tempx=x+dx[i],tempy=y+dy[i];if(tempx<0||tempx>=3||tempy<0||tempy>=4) continue;if(!st[tempx*4+tempy]) continue;if(mp[{tempx,tempy}]) continue;q.push({tempx,tempy});}}return mp.size()==5;//连通块内的个数是不是5
}
void dfs(int index)
{if(index==5){if(check()) cnt++;return;}for(int i=0;i<=11;i++){if(!st[i]){a[index]=i,st[i]=1;dfs(index+1);st[i]=0;}}
}
int main(void)
{dfs(0);//A12选5 int temp=1;for(int i=1;i<=5;i++) temp=temp*i;//除以重复的5!cout<<cnt/temp;return 0;
}

交换瓶子【找环】

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,a[N],st[N];
int main(void)
{while(cin>>n) {memset(st,0,sizeof st);for(int i=1;i<=n;i++) cin>>a[i];int ans=0;for(int i=1;i<=n;i++){int cnt=0;for(int j=a[i];!st[j];j=a[j]) {st[j]=1,cnt++;}if(cnt) ans+=cnt-1;//环的边数减1}cout<<ans<<endl;}return 0;
}

寒假作业【全排列】

#include<cstring>
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int b[15]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans=0;
int main(void)
{do{if(b[0]+b[1]==b[2])if(b[3]-b[4]==b[5])if(b[6]*b[7]==b[8])if( ( b[9]/b[10]==b[11] )&& (b[9]%b[10]==0) )ans++;}while(next_permutation(b,b+13));printf("%d\n",ans);//cout<<64;return 0;
}

报纸页数【找规律】


题解
1728+1125-1

卡片换位【BFS】

#include<bits/stdc++.h>
using namespace std;
string s1,s2,a,b;
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int A,B;
int bfs()
{map<string,int>mp;queue<string>q; q.push(s1);mp[s1]=0;while(q.size()){string s=q.front(); q.pop();int x1=s.find('A'),x2=s.find('B');if(x1==A&&x2==B){return mp[s];}int index=s.find(' '),x=index/3,y=index%3;for(int i=0;i<4;i++){int tempx=x+dx[i],tempy=y+dy[i];if(tempx<0||tempx>=2||tempy<0||tempy>=3) continue;string temp=s;int c1=index,c2=tempx*3+tempy;swap(temp[c1],temp[c2]);if(mp.count(temp)) continue;mp[temp]=mp[s]+1;q.push(temp);}}
}
int main(void)
{while(getline(cin,a)){getline(cin,b);s1=a+b;A=s1.find('B'),B=s1.find('A');cout<<bfs()<<endl;}return 0;
}

最大比例【gcd 辗转相减法】

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
typedef pair<LL,LL> pii;
const int N=110;
LL n;
LL gcd(LL a,LL b)
{return b?gcd(b,a%b):a;
}
LL gcd_sub(LL a,LL b)
{if(a<b) swap(a,b);  //始终保证a比b大if(b==1) return a;  //这里到了边界,为什么是1?说明上一层的时候a和b已经相等,这时候最大公约数是他们中的任一个return gcd_sub(b,a/b);
}
int main(void)
{while(cin>>n){vector<LL>a;for(int i=0;i<n;i++){LL x; cin>>x;a.push_back(x);}sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());vector<pii>ve;for(int i=1;i<a.size();i++){LL temp=gcd(a[i],a[0]);ve.push_back( {a[i]/temp,a[0]/temp} );}LL ansx=ve[0].first,ansy=ve[0].second;for(int i=1;i<ve.size();i++){ansx=gcd_sub(ansx,ve[i].first);ansy=gcd_sub(ansy,ve[i].second);}cout<<ansx<<"/"<<ansy<<endl;}return 0;
}

网友年龄【枚举】

#include<bits/stdc++.h>
using namespace std;
int cnt;
int main(void)
{for(int i=27;i<=100;i++){int s=i/10+(i%10)*10;if(s+27==i) cnt++;}cout<<cnt;return 0;
}

2016年蓝桥杯省赛题解相关推荐

  1. 第十一届蓝桥杯校内赛题解

    1 问题描述 两个二进制数11110011101和1111101001的和是多少?请用二进制表示,注意在提交的时候不要提交前导0. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结 ...

  2. SWPU第二届天梯选拔赛暨蓝桥杯训练赛题解

    视频讲解 https://www.bilibili.com/video/BV1kL4y1T7mm 比赛链接 http://acm.mangata.ltd/contest/622ed2175735814 ...

  3. 第十届蓝桥杯省赛题解+代码

    文章目录 组队(5分)(暴力) 年号字符(5分) 题解 AC 数列求值(10分)(递推) 题解 AC 数的分解(10分)(暴力) 题解 AC 迷宫(15分)(BFS) 题解 AC代码 特别数的和(15 ...

  4. 2016年蓝桥杯省赛C/C++ A组-剪邮票

    题目 如下图,有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,粉红色所示部分就是合格的剪取. 题解 全排列+递归 或 DFS+递归. ...

  5. 2015年蓝桥杯省赛题解

    题单地址:http://oj.ecustacm.cn/viewnews.php?id=1021 持续更新 目录 奇妙的数字[水] 加法变乘法[水] 移动距离[水] 打印大X[水] 牌型种数[dfs] ...

  6. 2016年蓝桥杯省赛A组c++第8题(暴力求解)

    /* 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和.比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 ...

  7. 【OJ】2020蓝桥杯模拟赛题解(Java语言描述)

    T1 问题描述 1200000有多少个约数(只计算正约数). 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. ...

  8. 2016届蓝桥杯省赛B组 第5题 勾股定理

    勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形. 已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数. 求满足这个条件的不同直角三角形的个数. [数据格式] 输入一 ...

  9. 2017_第八届蓝桥杯省赛题解 JavaB组

    一. (CSDN的排版和博客园有点不一样...算啦,改天再改一下排版) 大家可以看我在博客园的这篇博客,这个排版比较没问题 https://www.cnblogs.com/HeroCat/p/1046 ...

最新文章

  1. jemeter监听器的使用
  2. 【重磅】吴恩达又一项目Landing.ai曝光,这一次,他是要给传统制造业狠狠开刀!
  3. python学习手册翻译很差吗-为什么要翻译?值得坚持下去么?
  4. iOS - 内购_类型
  5. 网易云解码实时音视频社交 成就游戏产业发展新变量
  6. jquery 按钮效果 正常、移上、按下
  7. Python for i in range ()用法详解
  8. windows下apache并发php,windows环境下apache死机问题的解决一例
  9. MongoDB学习笔记二—Shell操作
  10. 敏捷和devops区别_DevOps转型:小型,中型和大型组织的主要区别
  11. 接口测试之post常见数据提交方式
  12. php爬取js对象,php如何用正则解析html中的js对象
  13. 如何交叉编译 移植 QT
  14. HDU2571 命运【动态规划DP】
  15. 购物商城微信小程序演示
  16. 求长方形和正方形的面积
  17. 微信公众号基础入门知识
  18. PMP/CAPM/PgMP/ACP考试报名资格
  19. 第八届 蓝桥杯 省赛 java B
  20. 【C语言进阶】⑤关于数组传参和指针传参辨析

热门文章

  1. 微信小程序背景图虚化
  2. javascript对时间的处理
  3. 配置Docker代理已实现外网访问
  4. qt5 + vs2015自定义控件错误:undefend interface
  5. u3d局域网游戏网络(c# socket select 模型)
  6. uboot重定位代码分析(转)
  7. 一步一步asp.net_页面静态化管理
  8. [转+总结]Linux虚拟系统安装VMware Tools总结
  9. 初探WCF 如何在配置文件中指定Address?
  10. 中断嵌套引起的问题记录