一、    煤球数目

作答:171700

#include <iostream>
using namespace std; int main() {
int sum=,x=;
for(int i=;i<=;i++){
x+=i;
sum += x;
}
cout<<sum;
}

二、    生日蜡烛

作答:26

#include <iostream>
using namespace std; int main() {
for(int i=;i<;i++){
int sum=;
for(int j=i;sum<;j++){
sum+=j;
}
if(sum==){
cout<<i;
break;
}
}
}

三、    凑算式

纯暴力+剪枝,剪成这样大概30s就跑出来了,觉得剪得差不多了,跑起来试试,反正跑的时候又不耽误继续写。

作答:29

#include <iostream>
#include <math.h>
using namespace std; int gcd(int x, int y) {
if (y == )return x;
return gcd(y, x%y);
}
int lcm(int x, int y) {
return x * y / gcd(x, y);
}
void simp(int &x, int &y) {
int t = gcd(x, y);
x /= t;
y /= t;
}
void add(int &x1, int &y1, int x2, int y2) {
int t = lcm(y1, y2);
x1 = x1 * t / y1 + x2 * t / y2;
y1 = t;
simp(x1, y1);
}
int repeat(int A, int B, int C, int DEF, int GHI) {
int a[] = { };
a[A]++; a[B]++; a[C]++;
while (DEF > ) {
a[DEF % ]++;
a[GHI % ]++;
GHI /= ;
DEF /= ;
}
if (a[] > )return ;
for (int i = ; i < ; i++) {
if (a[i] > )return ;
}
return ;
}
int main() {
int count = ;
for (int A = ; A <= ; A++) {
for (int B = ; B <= ; B++) {
if (A == B)continue;
for (int C = ; C <= ; C++) {
if (A == C || B == C || (A + B / (float)C > ))continue;
for (int DEF = ; DEF <= ; DEF++) {
for (int GHI = ; GHI <= ; GHI++) {
if (repeat(A, B, C, DEF, GHI)) continue;
else {
int a = A, b = B, c = C, def = DEF, ghi = GHI;
add(b, c, def, ghi);
if (c == && b == - a) {
cout << A << "+" << B << "/" << C << "+" << DEF << "/" << GHI << "=" << << endl;
count++;
}
}
}
}
}
}
}
cout << count << endl;
return ;
}

四、    快速排序

快速排序的partition过程,基本算法是很重要的。

swap(a,p,j);

五、    抽签

看到题目,第一反应,这肯定是个递归,蒙蒙看,看终止条件K==N,输出条件m==0,

第一次试,f(a,k+1,m-1,b); 不对。

第二次试,f(a,k+1,m-j,b); 半分钟解决。。。。

其实仔细看下,也很简单,k表示第几个国家,m表示当前还剩多少空位。当然实际循环里,添加进去b数组的不止5个,多出来的,b[M] = 0; 都给砍掉了。

f(a,k+,m-j,b);

六、方格填数

1580

    #include <iostream>

    #include <stdio.h>

    #include <algorithm>

    using namespace std;

    int f1(int a[][], int x, int y) {

        for (int i = x - ; i <= x + ; i++)

            for (int j = y - ; j <= y + ; j++) {

                if (i == x && y == j)continue;

                if (a[x][y] +  == a[i][j] || a[x][y] -  == a[i][j])return ;

            }

        return ;

    }

    int f2(int x, int y) {

        if (x == y +  || x == y -  || x == y)return ;

        return ;

    }

    int main() {
int a[][] = { - };
int count = ;
for (int a0 = ; a0 <= ; a0++) {
for (int a1 = ; a1 <= ; a1++) {
if (f2(a0, a1))continue;
for (int a2 = ; a2 <= ; a2++) {
if (a2 == a0 || f2(a2, a1))continue;
for (int a3 = ; a3 <= ; a3++) { if (a3 == a2 || a3 == a1 || f2(a3, a0))continue; for (int a4 = ; a4 <= ; a4++) { if (f2(a4, a3) || a4 == a2 || f2(a4, a1) || f2(a4, a0))continue; for (int a5 = ; a5 <= ; a5++) { if (f2(a5, a4) || a5 == a3 || f2(a5, a2) || f2(a5, a1) || f2(a5, a0))continue; for (int a6 = ; a6 <= ; a6++) { if (f2(a6, a5) || a6 == a4 || a6 == a3 || f2(a6, a2) || f2(a6, a1) || a6 == a0)continue; for (int a7 = ; a7 <= ; a7++) { if (a7 == a6 || a7 == a5 || f2(a7, a4) || f2(a7, a3) || a7 == a2 || a7 == a1 || a7 == a0)continue; for (int a8 = ; a8 <= ; a8++) { if (f2(a8, a7) || a8 == a6 || f2(a8, a5) || f2(a8, a4) || f2(a8, a3) || a8 == a2 || a8 == a1 || a8 == a0)continue; for (int a9 = ; a9 <= ; a9++) { if (f2(a9, a8) || a9 == a7 || f2(a9, a6) || f2(a9, a5) || f2(a9, a4) || a9 == a3 || a9 == a2 || a9 == a1 || a9 == a0)continue; count++; }
}
}
}
}
}
}
}
}
}
cout << count << endl;
}

七、剪邮票

, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

这5个点一定是个连通图,BFS更好写。

核心思想:1. BFS判定给定的5个位置是否符合。

     2. 每层循环取不同值,避免重复

#include <iostream>
#include <queue>
using namespace std; bool BFS(int a, int b, int c, int d, int e) {
bool m[] = {};
queue<int>q;
m[b] = ; m[c] = ; m[d] = ; m[e] = ;
q.push(a);
while (!q.empty()) {
int i = q.front(); q.pop();
//向上走
if ((i - ) > && m[i - ] == ) {
m[i - ] = ;
q.push(i - );
}
//向下走
if ((i + ) < && m[i + ] == ) {
m[i + ] = ;
q.push(i + );
}
//向右走
if (i != && i != && i + < && m[i + ] == ) {
m[i + ] = ;
q.push(i + );
}
//向左走
if (i != && i != && i - > && m[i - ] == ) {
m[i - ] = ;
q.push(i - );
}
}
for (int i = ; i < ; i++) if (m[i])return false;
return true;
} int main() {
int a, b, c, d, e, res = ;
for (a = ; a <= ; a++) {
for (b = a + ; b <= ; b++) {
for (c = b + ; c <= ; c++) {
for (d = c + ; d <= ; d++) {
for (e = d + ; e <= ; e++) {
if (BFS(a, b, c, d, e)) {
printf("%d %d %d %d %d\n", a, b, c, d, e);
res++;
}
}
}
}
}
}
cout << res << endl;
return ;
}

八、四平方和定理

(1)NC做法,四重循环,死求,能出来,但是时间上,完全不达标。

(2)三重循环:因为第四个数可以由 前三个数和输入的数相剪 得出,省去最后一个循环。效率提升就很显著了。

#include <iostream>
#include <math.h>
using namespace std; int main() {
int x, i, j, k;
int sign = ;
cin >> x;
double X = sqrt(x);
for (i = ; sign&&i <= X; i++) {
for (j = i; sign&&j <= X; j++) {
for (k = j; sign&&k <= X; k++) {
double L = sqrt(x - i * i - j * j - k * k);
if (L == (int)L) {
cout << i << " " << j << " " << k << " " << L << endl;
sign = ;
}
}
}
}
return ;
}

(3)三重循环,将算过的数据存起来 + 剪枝:

#include <iostream>
#include <math.h>
using namespace std; int main() {
int x, i, j, k;
int sign = ;
cin >> x;
int *arr = new int[x];
memset(arr, , x * sizeof(int));
double X = sqrt(x);
for (i = ; sign&&i <= X; i++) {
if (!arr[i]) arr[i] = i * i;//i^2没算过,就算好存起来
for (j = i; sign&&j <= X; j++) {
if (!arr[j]) arr[j] = j * j;//j^2没算过,就算好存起来
int J = arr[i] + arr[j];
if (J > x) break;//剪枝
for (k = j; sign&&k <= X; k++) {
if (!arr[k]) arr[k] = k * k;//k^2没算过,就算好存起来
int K = J + arr[k];
if (K > x) break;
double L = sqrt(x - K);
if (L == (int)L) {
cout << i << " " << j << " " << k << " " << L << endl;
sign = ;
}
}
}
}
return ;
}

九、交换瓶子

一开始,觉得最快的应该是快速排序的交换过程,后来仔细想下,数据很特殊,最后有序情况下,就是a[i]=i;快速排序还是会进行很多次无用的交换。

就从前面往后直接找,所以下标是1的位置就应该放1号瓶子,以此类推。

正常是一次交换排好一个元素,想要一次排好两个元素,就得数据支持,比如 a [ i ] = j ; a [ j ] = i ;这个交换代码也是可以做到的,所以这就是最少的步数。

#include <iostream>
using namespace std; int main()
{
int n,a[];
cin>>n;
for(int i = ; i <= n; i++)
cin>>a[i];
int ans = ;
for(int i = ; i <= n; i++)
{
while(a[i] != i) //如果数值和下标不相等,直接交换
{
swap(a[i],a[a[i]]);
ans++;
}
}
cout<<ans<<endl;
return ;
}

十、最大比例

首先这个比例一定是 大于 1 ,小于 max/min 的 ,那我们就可以用这个 max/min 不断除以自身的最小素因子,来寻找答案。

思想:

1. 用最大的数 除以 最小的数,得到一个可能的最大比例(A/B)。

2. 从小到大进行遍历。

  • 如果第 i 个数乘以A/B小于第 i+1个数,继续乘A/B。
  • 如果大于第i+1个数,说明这个比例是不对的(大了),A和B分别除去自己的最小素因子。

3. 遍历一遍之后,会得到一个A/B。但这并不一定是答案,回到第二步,如果整个遍历都没有出现第二部的蓝色字段,出来的就是答案了。

上面的这些过程,时间主要在找素因子上,我们可以分析得到,这个最大的素因子会出现的情况是:X=x^2,X除1以外只有x一个因子,X数值上接近10^12,简单说就是素数表准备到 一百万 就够用了。

#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
#define N 1000000
int prime[];
int M[N+];
//打素数表
void EulerSieve() {
int count = ;
for (int i = ; i <= N; i++) {
if (M[i] == ) {
prime[count++] = i;
}
for (int j = ; j < count && prime[j] * i <= N; j++) {
M[i*prime[j]] = ;
if (i%prime[j] == )
break;
}
}
}
ll getMinPrimefactor(ll x) {
if (x < N&&M[x] == )return x;
//不知道具体数字,循环终止写大点无所谓,不会做到后面的。
for (int i = ; i < ; i++) {
if (prime[i] == )return x;
if (x%prime[i] == )return prime[i];
} } ll gcd(ll a, ll b) {
return b ? gcd(b, a%b) : a;
} void reduce(ll &x, ll &y) {
ll g = gcd(x, y);
x /= g; y /= g;
}
//分数除
void div(ll &x1,ll &y1,ll x2,ll y2) {
y1 *= x2; x1 *= y2;
reduce(x1, y1);
}
//分数乘
void mul(ll &x1, ll &y1, ll x2, ll y2) {
y1 *= y2; x1 *= x2;
reduce(x1, y1);
}
void check(ll &A,ll &B,set<ll>s,int &flag) {
set<ll>::iterator it = s.begin();
while (true) {
ll a = *it++, b = ;
if (it == s.end()) return;
while (a < *it) {
mul(a, b, A, B);
}
if (a > *it) {
B /= getMinPrimefactor(B);
A /= getMinPrimefactor(A);
flag = true;
it--;
}
//if (a == *it) {
// cout << A << "/" << B << endl;
//}
}
}
int main() {
ll n, t;
int flag = true;
EulerSieve();
cin >> n;
set<ll>s;
for (ll i = ; i < n;i++) {
cin >> t;
s.insert(t);
} ll B = *s.begin(), A = *s.rbegin();
reduce(A, B);
while (flag) {
flag = false;
check(A,B,s, flag);
}
cout << A << "/" << B << endl;
return ;
}

【2016蓝桥杯省赛】试题C++ B组试题的更多相关文章

  1. 【2015蓝桥杯省赛】C++ B组试题

    1.奖券数目 作答:52488,正确 #include <iostream> using namespace std; bool check(int x) { ] = { }; while ...

  2. 2016蓝桥杯省赛C/C++A组第二题 跳蚱蜢

    题意:有9只盘子,排成1个圆圈.  其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中.  请 ...

  3. 2016蓝桥杯省赛C/C++A组第九题 密码脱落

    题意: X星球的考古学家发现了一批古代留下来的密码. 这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其中 ...

  4. 2016蓝桥杯省赛C/C++A组第八题 四平方和

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

  5. 2016蓝桥杯省赛C/C++A组第七题 剪邮票(暴力+并查集)

    题意:有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连) 分析:暴力+并查集. 1.记录下每个数字所在位置. 2.先枚举各不相同的5个数的所有可能情 ...

  6. 2016蓝桥杯省赛C/C++A组第六题 寒假作业

    题意:现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ 每个方块代表1~13中的某一个数字,但不能重复. 比如: ...

  7. 2016蓝桥杯省赛C/C++A组第三题 方格填数

    题意:如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 分析:dfs,划定边界,行1~4,列1~3,初始化为INT_IN ...

  8. 带分数--第四届蓝桥杯省赛C++B/C组

    第四届蓝桥杯省赛C++B/C组----带分数 思路: 1.先枚举全排列 2.枚举位数 3.判断是否满足要求 这道题也就是n=a+b/c,求出符合要求的abc的方案数.进行优化时,可以对等式进行改写,改 ...

  9. 2019年第十届蓝桥杯省赛总结(JavaA组)

    //update3.28:省一rank4,莫名进了国赛好神奇.. 记yzm10第一次体验A组(纯粹瞎水). 早闻山东的JavaA组神仙打架,进国赛都成了奢望(往年只有五个名额),因此抱着做分母的心态来 ...

  10. 2019年第十届蓝桥杯国赛总结(JavaA组)

    JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...

随机推荐

  1. js返回一组日期中最近连续的天数

    用js获取一组日期(并把当天算入)中连续的天数 刚开始可能想到单纯的比较日期大小判断连续, 而又有大小月,平闰年这些因素,还是时间戳来的安全; 首先得有一组日期,比如: var arr = [ '20 ...

  2. SESSION机制(转)

    转自:http://www.cnblogs.com/zyf-zhaoyafei/p/4477175.html 一:Session与Cookie Session:在服务器端创建并存放在服务器的内存中的, ...

  3. html基础-a标签-img标签-绝对/相对路径(3)

    美好的星期六,今天多写一点,争取早点写js这个有点小无聊. 一.先来讲点网页之间的跳转 (1).<a href=""></a>  href="这里 ...

  4. ios 为什么拖拽的控件为weak 手写的strong

    ib拖拽的控件自动声明为weak  而平时自己手写的为strong 在ios中,对象默认都是强引用,不是强引用赋值后会立即释放 ib声明weak 不立即被释放 简单说就是 1.声明的弱引用指向强引用 ...

  5. Ubuntu 添加删除用户 How to Add and Delete Users on Ubuntu 16.04

      Introduction One of the most basic tasks that you should know how to do on a fresh Linux server is ...

  6. redis 命令行查看修改配置文件项、配置文件说明

    命令行查看修改配置文件项 config get | config set | config rewrite config get requirepass // 获取密码config set requi ...

  7. mybatis 一对一 映射实体类、嵌套查询

    一对一 在SysUser 类中增加SysRole字段.1.sql语句将role.role_name映射到role.roleName上. 2.还可以在XML 映射文件中配置结果映射.<result ...

  8. 使用jar命令打jar/war包、创建可执行jar包、运行jar包、及批处理脚本编写

    jar 命令 jar 是一个jar.exe可执行命令,即可以生成jar文件,也可以生成war文件   使用示例:jar -cvf ../xxx.jar *  -c   create,创建新的归档文档 ...

  9. 实现自定义Session

    1. 回话状态接口 /// <summary> /// 会话状态策略接口 /// </summary> public partial interface ISessionStr ...

  10. 分页函数 pager.py

    #!/usr/bin/python env # coding:utf-8 class Pagination(object): # 数据总条数 当前页 每页显示条数 最多显示页面 def __init_ ...