2016年蓝桥杯B组C/C++决赛题解
2016年第七届蓝桥杯B组C/C++决赛题解
1.一步之遥
枚举解方程,或者套模板解线性方程
#include<bits/stdc++.h>
using namespace std;
int main(){
int ans = 0x3f3f3f3f;
for(int a=0;a<=100;a++){
for(int b=0;b<=100;b++){
if(97*a - 127*b == 1){
ans = min(ans,a+b);
}
}
}
cout<<ans<<endl;
return 0;
}
//97
2.凑平方数
思路:
分成几组? k组 1 ~ 10;
每组:dfs搜索0~9这几个没用过的数;
if 完全平方数
1.x+1
2.继续加值 (0不能作为第一个数 单独考虑)
到了k组 先对结果排序存到vector数组中 再set去重(因为递归回溯 结果有大量重复)
注意:必须用long long...用int会出错 因为int的取值范围为:-2147483648 ~ 2147483647
网上有全排列后 再dfs的方法,这样不用再回溯打乱顺序,博客地址:https://blog.csdn.net/riba2534/article/details/72480145
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int vis[15];
ll a[15];
vector<ll> v;
int vis2[10];
int k;
int ans = 0;
set<vector<ll> > se;
inline bool check(ll x){
if(x == 9814072356){
int eeeeee = 1;
}
double d = sqrt(x);
return d == (ll)d;
}
//因为递归回溯有大量重复 改成set去重
void dfs(int x,ll cur){
if(x == k){
for(int i=0;i<10;i++){
vis2[i] = 0;
}
for(int i=0;i<k;i++){
ll d = a[i];
if(d == 0) vis2[d] = 1;
else{
while(d){
vis2[d%10] = 1;
d = d/10;
}
}
}
for(int i=0;i<=9;i++){
if(!vis2[i]) return;
}
for(int i=0;i<k;i++) v.push_back(a[i]);
sort(v.begin(),v.end());
if(se.find(v) == se.end()){
for(int i=0;i<k;i++) cout<<v[i]<<" ";
cout<<endl;
se.insert(v);
}
v.clear();
ans++;
return;
}
for(int i=0;i<=9;i++){
if(!vis[i]){
vis[i] = 1;
if(cur == 0 && i == 0){//如果是以0开头 并且当前搜索的是一个新的分组(cur值为0) 就直接搜索下一组
a[x] = 0;
dfs(x+1,0);
vis[i] = 0;
continue;
}
ll num = cur*10+i;
if(check(num)){
a[x] = num;
dfs(x+1,0);
} //搜索下一分组
dfs(x,cur*10+i);//继续搜索当前分组
vis[i] = 0;
}
}
}
int main(){
//freopen("out1.txt","w",stdout);
//枚举分组的次数
for(k = 1;k <= 10;k++){
memset(vis,0,sizeof(vis));
dfs(0,0);
}
cout<<ans<<endl;
cout<<se.size()<<endl;
return 0;
}
//3085
//300
3.棋子换位
输出结果
手算
判断两者不同点
尝试给出答案。。 就这样做
思路:交换的两边不一样,才能跳
答案:valid(data, i+dd+dd) &&valid(data, i-dd) && data[i-dd] == data[i+dd+dd]
4.机器人塔
直接dfs搜索了,初步估计能过30%数据
思路:dfs搜索
首先理解题意:搭人梯 总人数肯定是按1 + 2 + 3 + 4 +.....+n 这种数据类型来给的 题目写了保证数据合理。
我们可以提前预处理 给定的人数应该搭人梯 共几层 比如样例:1 2 就是2层 样例:3 3就是3层 满足等差数列 1 + 2 + 3,我们根据等差数列性质求出下面代码的belong数组 有sum个人时对应的层数
belong[a+b] 算出 等于共k层,当然用等差数列公式开方也直接能算的,不用再预处理了。。。。。。
用等差数列公式开方,上面过程可以不看
主要是dfs:
随后 dfs搜索每一层:dfs(int x,int cur,int numa,int numb) 参数含义:第x层 当前层的第cur个位置 使用a的数量numa 使用b的数量numb
按题目条件dfs填充a[x][cur]就可以了
剪枝后也只能过小数据
#include<bits/stdc++.h>
using namespace std;
const int maxn = 510;
int belong[maxn*maxn];
int a[maxn][maxn];
int n,m;
int ans = 0;
int k;
void dfs(int x,int cur,int numa,int numb){
if(x == k){ //出口:最后一层只能放置一个 容易判断
if(numa == n-1 && numb == m){
if((a[x-1][1] == 1 && a[x-1][2] == 1) || (a[x-1][1] == 2 && a[x-1][2] == 2)){
ans++;
}
}
if(numb == m-1 && numa == n){
if((a[x-1][1] == 1 && a[x-1][2] == 2) || (a[x-1][1] == 2 && a[x-1][2] == 1)){
ans++;
}
}
return;
}
int idx = k-x+1;
if(x == 1){//第一层可以随意放
for(int i=cur;i<idx;i++){ //每一层可以放idx个
if(numa + 1 <= n){
a[x][i] = 1;
dfs(x,cur+1,numa+1,numb);
a[x][i] = 0;
}
if(numb + 1 <= m){
a[x][i] = 2;
dfs(x,cur+1,numa,numb+1);
a[x][i] = 0;
}
}
if(cur == idx){
if(numa + 1 <= n){
a[x][cur] = 1;
dfs(x+1,1,numa+1,numb);
a[x][cur] = 0;
}
if(numb + 1 <= m){
a[x][cur] = 2;
dfs(x+1,1,numa,numb+1);
a[x][cur] = 0;
}
}
}else{ //非第一层 受题目条件限制放置
for(int i=cur;i<idx;i++){ //每一层可以放idx个
if((a[x-1][i] == 1 && a[x-1][i+1] == 1) || (a[x-1][i] == 2 && a[x-1][i+1] == 2)){
if(numa + 1 <= n){
a[x][i] = 1;
dfs(x,cur+1,numa+1,numb);
a[x][i] = 0;
}
}
if((a[x-1][i] == 1 && a[x-1][i+1] == 2) || (a[x-1][i] == 2 && a[x-1][i+1] == 1) ){
if(numb + 1 <= m){
a[x][i] = 2;
dfs(x,cur+1,numa,numb+1);
a[x][i] = 0;
}
}
}
if(cur == idx){
if((a[x-1][cur] == 1 && a[x-1][cur+1] == 1) || (a[x-1][cur] == 2 && a[x-1][cur+1] == 2)){
if(numa + 1 <= n){
a[x][cur] = 1;
dfs(x+1,1,numa+1,numb);
a[x][cur] = 0;
}
}
if((a[x-1][cur] == 1 && a[x-1][cur+1] == 2) || (a[x-1][cur] == 2 && a[x-1][cur+1] == 1) ){
if(numb + 1 <= m){
a[x][cur] = 2;
dfs(x+1,1,numa,numb+1);
a[x][cur] = 0;
}
}
}
}
}
void init(){
for(int i=1;i<=200;i++){
int sum = 0;
for(int j=1;j<=i;j++){
sum += j;
}
belong[sum] = i;
}
}
int main(){
init();
cin>>n>>m;
k = belong[n+m];
dfs(1,1,0,0);
cout<<ans<<endl;
return 0;
}
5.广场舞
想到思路了,但是做起来还是挺麻烦的,不写了
提供几条资料
百度:计算几何 判断点与多边形的关系
这题题解博客(不保证准确性 但是博主写的很详细能看懂得) https://blog.csdn.net/codeswarrior/article/details/80397275
6.生成树计数
不写了
2016年蓝桥杯B组C/C++决赛题解的更多相关文章
- 2016年蓝桥杯B组C/C++决赛题目
2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...
- 2018年蓝桥杯A组C/C++决赛题解
2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...
- 2015年蓝桥杯B组C/C++决赛题解
2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案) 1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...
- 2018年蓝桥杯B组C/C++决赛题解
2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...
- 2017年蓝桥杯B组C/C++决赛题解
2017年蓝桥杯B组C/C++决赛题目(不含答案) 1.36进制 ok 求36进制,类比二进制转10进制,36^3 + 36^2 + 36^1 + 36^0 2.磁砖样式 ok dfs搜索 我自己写的 ...
- 2018年蓝桥杯A组C/C++决赛题目
2018年蓝桥杯A组C/C++决赛题目 2018年蓝桥杯A组C/C++决赛题解 1:三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5 ...
- 2017年蓝桥杯B组C/C++决赛题目
2017年第八届蓝桥杯B组C/C++决赛题目 点击查看2017年蓝桥杯B组C/C++决赛题解 1.36进制 对于16进制,我们使用字母A-F来表示10及以上的数字. 如法炮制,一直用到字母Z, ...
- 2016年蓝桥杯B组C/C++省赛(预选赛)题目解析
2016年蓝桥杯B组C/C++ 点击查看2016年蓝桥杯B组省赛试题(无答案版) 第一题:煤球数目 题解 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个( ...
- 2016年蓝桥杯B组C/C++省赛(预选赛)试题
2016年蓝桥杯B组C/C++ 点击查看2016年蓝桥杯B组省赛题目解析(答案) 第一题:煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成 ...
随机推荐
- SSH agent 的使用 - 资料摘录
下面是一些ssh agent的资料简要摘录,网路上的相关的文章已经很多了: ssh 推荐的登录方式是使用私钥登录.但是如果生成私钥的时候,设置了口令(passphrase),每次登录时需要输入口令也很 ...
- QPNP 8909 8916 充电相关(2)【转】
上一篇主要讲电池相关的一些知识,上节忘记讲了,电池一般分为电量计电池和非电流计电池,电量计电池,就不需要用pmu8916的IC,当然这只是只,不需要BMS来计算soc,而jni层也需要读取电流计的电池 ...
- Linux Thermal Framework分析及实施
关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...
- 物理像素[设备像素] & 逻辑像素[CSS像素];
为什么移动端CSS里面写了1px,实际上看起来比1px粗 了解设备物理像素和逻辑像素的同学应该很容易理解,其实这两个px的含义其实是不一样的, UI设计师要求的1px是指设备的物理像素1px,而CSS ...
- 设计模式-FlyWeight(结构型模式) 针对 需要创建大量对象的情形,被共享的状态作为内部状态,不被共享的状态作为外部状态
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Flyweight.h #pragma once #include<string> class FlyWeig ...
- 函数基础实战之ATM和购物车系统
username_list = [] prize_dict = { '0': "芭比娃娃", '1': "变形金刚", '2': "psp游戏机&qu ...
- python做中学(二)bool()函数的用法
定义: bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False. bool 是 int 的子类. 语法: 以下是 bool() 方法的语法: class bool([x] 参数 ...
- EJB学习
EJB:企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件. EJB主要有三种Bean: Session Beans: 会在单个特 ...
- Knative 实战:一个微服务应用的部署
作者 | 元毅 阿里云智能事业群高级开发工程师 在 Istio 中提供了一个 Bookinfo 的示例,用于演示微服务之间的调用,那么如何在 Knative 中部署这个示例呢?本文将会给大家介绍一下在 ...
- java中的常用类(二)
java中的常用类(二) Math类 Math类的声明:public final class Math extends Object Math类是与数学计算有关的类,里面的方法都是静态方法,直接使用类 ...