zoukankan      html  css  js  c++  java
  • [题目][蓝桥杯ALGO] 大合集

    【合集内容】

    ALGO-22 至 ALGO-45

    【空缺】

    ALGO-16 进制转换

    ALGO-24 统计单词个数 

    蓝桥杯 ALGO-22 数的划分

    [题目][蓝桥杯ALGO-22] 数的划分

    蓝桥杯 ALGO-23 一元三次方程求解

    问题描述:

    有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 double a, b, c, d;
     5 
     6 double calc(double o) {
     7     return a * o * o * o + b * o * o + c * o + d; 
     8 }
     9 
    10 int main() {
    11     cin >> a >> b >> c >> d;
    12     for (double x = -100.0; x <= 100.0; x += 0.01) {
    13         double x1 = x - 0.005, x2 = x + 0.005;
    14         if (calc(x1) * calc(x2) < 0)
    15             cout << fixed << setprecision(2) << x << ' ';
    16     }
    17     return 0;
    18 }

    蓝桥杯 ALGO-24 统计单词个数

    蓝桥杯 ALGO-25 Car 的旅行路线

    [题目][NOIP2001][蓝桥杯ALGO-25] Car 的旅行路线

    蓝桥杯 ALGO-26 麦森数

    问题描述:

    形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。

    任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 1005
     5 
     6 int two[2] = {1, 2};
     7 int p, a[MAXN] = {1, 1}, b[MAXN], c[MAXN], bs;
     8     
     9 void mul(int a[], int b[]) {
    10     memset(c, 0, sizeof(c));
    11     for (int i = 1; i <= min(500, a[0]); i++)
    12         for (int j = 1; j <= min(500, b[0]); j++) {
    13             c[i + j - 1] += a[i] * b[j];
    14             if (c[i + j - 1] >= 10)
    15                 c[i + j] += c[i + j - 1] / 10, c[i + j - 1] %= 10;
    16         }
    17     a[0] = min(a[0] + b[0], 500);
    18     for (int i = 1; i <= a[0]; i++) a[i] = c[i];
    19 }
    20 
    21 int main() {
    22     cin >> p;
    23     cout << floor(log(2) / log(10) * p + 1);
    24     while (p) {
    25         bs = 1;
    26         b[0] = 1, b[1] = 2;
    27         while (p >= bs) {
    28             p -= bs, mul(a, b);
    29             bs <<= 1, mul(b, b);
    30         }
    31     }
    32     a[1]--;
    33     for (int i = 500; i >= 1; i--) {
    34         if (i % 50 == 0) cout << endl;
    35         cout << a[i];
    36     }
    37     return 0;
    38 }

    蓝桥杯 ALGO-27 FBI 树

    问题描述:

    我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

    FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

    1)T的根结点为R,其类型与串S的类型相同;

    2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

    现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 3005
     5 
     6 int n, tot;
     7 char a[MAXN], s[MAXN];
     8 
     9 char work(int x, int o) {
    10     if (o == 1) return a[++tot] = s[x] == '0' ? 'B' : 'I';
    11     int l = work(x, o >> 1), r = work(x + (o >> 1), o >> 1);
    12     return a[++tot] = l == r ? l : 'F';
    13 }
    14 
    15 int main() {
    16     cin >> n >> s + 1;
    17     work(1, strlen(s + 1));    
    18     for (int i = 1; i <= tot; i++)
    19         cout << a[i];
    20     return 0;
    21 }

    蓝桥杯 ALGO-28 星际交流

    问题描述:

    人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样 的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回 答。

    火星人用一种非常简单的方式来表示数字——掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3……。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。

    一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指——拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列 时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形 成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。下表展示了只有3根手指时能够形成的6个 3位数和它们代表的数字:

    三进制数 123 132 213 231 312 321

    代表的数字 1 2 3 4 5 6

    现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科 学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 10005
     5 #define INF 1 << 30
     6 
     7 int n, m, a[MAXN];
     8 
     9 int main() {
    10     cin >> n >> m;
    11     for (int i = 1; i <= n; i++)
    12         cin >> a[i];
    13     for (int k = 1; k <= m; k++)
    14         for (int i = n - 1; i >= 1; i--)
    15             if (a[i] < a[i + 1]) {
    16                 int mi = INF, x;
    17                 for (int j = i + 1; j <= n; j++)
    18                     if (mi > a[j] && a[j] > a[i])
    19                         mi = a[j], x = j;
    20                 swap(a[i], a[x]);
    21                 sort(a + i + 1, a + n + 1);
    22                 break;
    23             }
    24     for (int i = 1; i <= n; i++)
    25         cout << a[i] << ' ';
    26     return 0;
    27 }

    蓝桥杯 ALGO-29 校门外的树

    问题描述:

    某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数 轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

    由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已 知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树 都移走后,马路上还有多少棵树。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 10005
     5 
     6 int n, m, ans, t[MAXN], l, r;
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= m; i++) {
    11         cin >> l >> r;
    12         for (int j = l; j <= r; j++)
    13             t[j] = 1;
    14     }
    15     for (int i = 0; i <= n; i++)
    16         ans += !t[i];
    17     cout << ans;
    18     return 0;
    19 }

    蓝桥杯 ALGO-30 入学考试

    问题描述:

    辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

    如果你是辰辰,你能完成这个任务吗?

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 1005
     5 
     6 int n, m, ans, t[MAXN], v[MAXN], f[MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= m; i++)
    11         cin >> t[i] >> v[i];
    12     for (int i = 1; i <= m; i++)
    13         for (int j = n; j >= t[i]; j--)
    14             f[j] = max(f[j], f[j - t[i]] + v[i]);
    15     for (int i = 1; i <= n; i++)
    16         ans = max(ans, f[i]);
    17     cout << ans;
    18     return 0;
    19 }

    (就是最基本的背包 DP 模板题采药问题,入学考试这个标题没太看懂)

    蓝桥杯 ALGO-31 开心的金明

    问题描述:

    金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎 么布置,你说了算,只要不超过N元钱就行”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N元。于是,他把每件物品规定了一 个重要度,分为5等:用整数1~5表示,第5等最重要。他还从因特网上查到了每件物品的价格(都是整数元)。他希望在不超过N元(可以等于N元)的前提 下,使每件物品的价格与重要度的乘积的总和最大。

    设第j件物品的价格为v[j],重要度为w[j],共选中了k件物品,编号依次为 j1,j2,……,jk,则所求的总和为:

    v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*为乘号)

    请你帮助金明设计一个满足要求的购物单。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 30005
     5 
     6 int n, m, ans, t[MAXN], v[MAXN], f[MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= m; i++)
    11         cin >> t[i] >> v[i];
    12     for (int i = 1; i <= m; i++)
    13         for (int j = n; j >= t[i]; j--)
    14             f[j] = max(f[j], f[j - t[i]] + v[i] * t[i]);
    15     for (int i = 1; i <= n; i++)
    16         ans = max(ans, f[i]);
    17     cout << ans;
    18     return 0;
    19 }

    蓝桥杯 ALGO-32 JAM 计数法

    问题描述:

    Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U<V< span>,且不存在Jam数字P,使U<P<V< span>)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 35
     5 
     6 int l, r, n;
     7 char a[MAXN];
     8 
     9 int main() {
    10     cin >> l >> r >> n >> a + 1;
    11     l += 'a' - 1, r += 'a' - 1;
    12     for (int i = 1; i <= 5; i++) {
    13         for (int j = n; j >= 1; j--)
    14             if (a[j] != r + j - n) {
    15                 a[j]++;
    16                 int o = a[j];
    17                 for (int k = j + 1; k <= n; k++)
    18                     a[k] = ++o;
    19                 break;
    20             }
    21         for (int j = 1; j <= n; j++)
    22             cout << a[j];
    23         cout << endl;
    24     }
    25     return 0;
    26 }

    蓝桥杯 ALGO-33 数列

    问题描述:

    给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:

    1,3,4,9,10,12,13,…

    (该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)

    请你求出这个序列的第N项的值(用10进制数表示)。

    例如,对于k=3,N=100,正确答案应该是981。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 long long k, n, x, o, ans;
     5 
     6 int main() {
     7     cin >> k >> n;
     8     for (o = 1; o <= n; o <<= 1, x++);
     9     o >>= 1;
    10     while (n) {
    11         if (n >= o) n -= o, ans += pow(k, x - 1);
    12         o >>= 1, x--;
    13     }
    14     cout << ans;
    15     return 0;
    16 }

    (代码是正确的,但并不能在蓝桥杯 OJ 上 AC,下载了数据后发现是 OJ 上的第 10 个数据点的答案有问题,可以忽视)

    蓝桥杯 ALGO-34 纪念品分组

    问题描述:

    元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有纪念品,乐乐希望分组的数目最少。

    你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 30005
     5 
     6 int mx, n, a[MAXN], l, r, ans;
     7 
     8 int main() {
     9     cin >> mx >> n;
    10     for (int i = 1; i <= n; i++)
    11         cin >> a[i];
    12     l = 1, r = n;
    13     sort(a + 1, a + n + 1);
    14     while (l < r) {
    15         if (a[l] + a[r] <= mx) l++, ans++;
    16         else if (a[r] <= mx) ans++;
    17         r--;
    18     }
    19     ans += l == r && a[l] <= mx;
    20     cout << ans;
    21     return 0;
    22 }

    蓝桥杯 ALGO-35 传球问题

    问题描述:

    上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

    游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止

    此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。

    聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 105
     5 
     6 int n, m, f[MAXN][MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     f[0][0] = 1;
    11     for (int i = 1; i <= m; i++)
    12         for (int j = 0; j < n; j++)
    13             f[i][j] = f[i - 1][(j - 1 + 2 * n) % n] + f[i - 1][(j + 1) % n];
    14     cout << f[m][0];
    15     return 0;
    16 }

    蓝桥杯 ALGO-36 传纸条

    问题描述:

    小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

    在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。

    还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    #define MAXN 55
    
    int n, m, a[MAXN][MAXN], f[MAXN][MAXN][MAXN][MAXN];
    
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)    
            for (int j = 1; j <= m; j++)
                cin >> a[i][j];
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                for (int k = 1; k <= n; k++)
                    for (int l = 1; l <= m; l++) {
                        if (i == k || j == l) continue;
                        f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l], f[i - 1][j][k][l - 1]),
                                            max(f[i][j - 1][k - 1][l], f[i][j - 1][k][l - 1]))
                                        + a[i][j] + a[k][l];
                    }
        cout << f[n][m - 1][n - 1][m];
        return 0;
    }

    蓝桥杯 ALGO-37 Hankson 的趣味题

    问题描述:

    Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数。现 在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整数 x 满足: 1. x 和 a0 的最大公约数是 a1 ; 2. x 和b0 的最小公倍数是b1。 Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的 x 的个数。请你帮 助他编程求解这个问题。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int t, a, b, c, d;
     5 
     6 int gcd(int x, int y) {
     7     return y ? gcd(y, x % y) : x;
     8 }
     9 
    10 int main() {
    11     cin >> t;
    12     for (int j = 1; j <= t; j++) {
    13         cin >> a >> b >> c >> d;
    14         int p = a / b, q = d / c, ans = 0;
    15         for (int x = 1; x * x <= d; x++)
    16             if (d % x == 0) {
    17                 ans += x % b == 0 && gcd(x / b, p) == 1 && gcd(q, d / x) == 1;
    18                 int y = d / x;
    19                 if (x == y) continue;
    20                 ans += y % b == 0 && gcd(y / b, p) == 1 && gcd(q, d / y) == 1;
    21             }
    22         cout << ans << endl;
    23     }
    24     return 0;
    25 }

    (x 必然不会超过 d,直接枚举就行了,想半天没想出这么简单的办法 = =)

    蓝桥杯 ALGO-38 接水问题

    问题描述:

    学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1 到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j 完成其接水量要求 wj 后,下一名排队等候接水的同学 k 马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第 x 秒结束时完成接水,则 k 同学第 x + 1 秒立刻开始接水。若当前接水人数 n’ 不足 m, 则只有 n’ 个龙头供水,其它 m − n’ 个龙头关闭。 现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 10005
     5 
     6 int n, m, a[MAXN], b[MAXN], x, o, ans;
     7 
     8 
     9 int main() {
    10     cin >> n >> m;
    11     for (int i = 1; i <= n; i++)
    12         cin >> a[i];
    13     o = m;
    14     for (int i = 1; i <= m; i++)
    15         b[i] = a[i];
    16     while (x != m) {
    17         x = 0, ans++;
    18         for (int i = 1; i <= m; i++) {
    19             if (b[i]) b[i]--; 
    20             if (!b[i]) 
    21                 if (o != n) b[i] = a[++o];
    22                 else x++;
    23         }
    24     }
    25     cout << ans;
    26     return 0;
    27 }

    蓝桥杯 ALGO-39 数组排序去重

    问题描述:

    输入 10 个整数组成的序列,要求对其进行升序排序,并去掉重复元素。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int a[11];
     5 
     6 int main() {
     7     a[0] = -1 << 30;
     8     for (int i = 1; i <= 10; i++)
     9         cin >> a[i];
    10     sort(a + 1, a + 11);
    11     unique(a + 1, a + 11);
    12     for (int i = 1; a[i - 1] < a[i]; i++)
    13         cout << a[i] << endl;
    14     return 0;
    15 }

    蓝桥杯 ALGO-40 会议中心

     ?

    蓝桥杯 ALGO-41 【无】

    蓝桥杯 ALGO-42 送分啦

    蓝桥杯 ALGO-43 A + B Problem

     (凑题大法好??)

    蓝桥杯 ALGO-44 采油区域

    [题目][APIO2009][蓝桥杯ALGO-44] 采油区域

    蓝桥杯 ALGO-45 调和数列问题

    问题描述:

    输入一个实数 x,求最小的 n 使得,1 / 2 + 1 / 3 + 1 / 4 + ... + 1 / (n + 1) >= x。

    输入的实数 x 保证大于等于 0.01,小于等于 5.20,并且恰好有两位小数。你的程序要能够处理多组数据,即不停地读入 x,如果 x 不等于 0.00,则计算答案,否则退出程序。

    输出格式为对于一个 x,输出一行 n card(s)。其中 n 表示要计算的答案。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 double x, o;
     5 int n;
     6 
     7 int main() {
     8     while (1) {
     9         cin >> x;
    10         if (!x) exit(0);
    11         o = 0;
    12         for (n = 2; o < x; n++) o += 1.0 / (double)n;
    13         cout << n - 2 << " card(s)" << endl;
    14     }
    15     return 0;
    16 }

    蓝桥杯 ALGO-46 Hanoi 问题

    问题描述:

    如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的M只盘子(当然移动盘子的数目也可以小于M),最少需要多少次?

    例如N=5,M=2时,可以分别将最小的2个盘子、中间的2个盘子以及最大的一个盘子分别看作一个整体,这样可以转变为N=3,M=1的情况,共需要移动7次。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int ans, m, n;
     5 
     6 void move(int n, int m) {
     7     if (n <= m) ans++;
     8     else {
     9         move(n - m, m); 
    10         ans++;
    11         move(n - m, m); 
    12     }
    13 }
    14 
    15 int main() {
    16     cin >> n >> m;
    17     move(n, m);
    18     cout << ans << endl;
    19     return 0;
    20 }

    蓝桥杯 ALGO-47 蜜蜂飞舞

    问题描述:

    “两只小蜜蜂呀,飞在花丛中呀……”

    话说这天天上飞舞着两只蜜蜂,它们在跳一种奇怪的舞蹈。用一个空间直角坐标系来描述这个世界,那么这两只蜜蜂初始坐标分别为(x1,y1,z1),(x2,y2,z2)  。在接下来它们将进行n次飞行,第i次飞行两只蜜蜂分别按照各自的速度向量飞行ti个单位时间。对于这一现象,玮玮已经观察了很久。他很想知道在蜜蜂飞舞结束时,两只蜜蜂的距离是多少。现在他就求教于你,请你写一个程序来帮他计算这个结果

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n;
     5 double vx1, vy1, vz1, vx2, vy2, vz2, t;
     6 double tx1, ty1, tz1, tx2, ty2, tz2;
     7 double x1, y11, z1, x2, y2, z2;
     8 
     9 double dis(double x1, double y1, double z1, double x2, double y2, double z2) {
    10     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2)); 
    11 }
    12 
    13 int main() {
    14     cin >> n;
    15     for (int i = 1; i <= n; i++) {
    16         cin >> vx1 >> vy1 >> vz1 >> vx2 >> vy2 >> vz2 >> t;
    17         tx1 += vx1 * t, ty1 += vy1 * t, tz1 += vz1 * t;
    18         tx2 += vx2 * t, ty2 += vy2 * t, tz2 += vz2 * t;
    19     }
    20     cin >> x1 >> y11 >> z1 >> x2 >> y2 >> z2;
    21     cout << fixed << setprecision(4) << dis(x1 + tx1, y11 + ty1, z1 + tz1, x2 + tx2, y2 + ty2, z2 + tz2);
    22     return 0;
    23 }

    蓝桥杯 ALGO-50 数组查找及替换

    问题描述:

    给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。元素个数不超过100,b在1至100之间。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 105
     5 
     6 int n, m, o, a[MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= n; i++) {
    11         cin >> a[++o];
    12         if (a[o] % m == 0) o--;
    13     }
    14     sort(a + 1, a + o + 1);
    15     for (int i = 1; i <= o; i++)
    16         if (a[i] >= 'A' && a[i] <= 'Z') cout << (char)a[i] << ' ';
    17         else cout << a[i] << ' ';
    18     return 0;
    19 }

    蓝桥杯 ALGO-52 排列问题

    问题描述:

    求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出现在i-1这个数后面,并保证第i行第i列为0),将这个排列看成一个自然数,求从小到大排序第K个排列。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 15
     5 
     6 int a[MAXN], n, k, vis[MAXN], f[MAXN][MAXN], cnt;
     7 
     8 void getp(int o) {
     9     if (o > n) {
    10         cnt++;
    11         if (cnt == k) {
    12             for (int i = 1; i <= n; i++)
    13                 cout << a[i] << ' ';
    14             exit(0); 
    15         }
    16         return;
    17     }
    18     for (int i = 0; i < n; i++) {
    19         int nob = 0;
    20         if (!vis[i] && f[a[o - 1]][i] || o == 1) {
    21             a[o] = i, vis[i] = 1;
    22             getp(o + 1);
    23             vis[i] = 0;
    24         }
    25     }
    26 }
    27 
    28 int main() {
    29     cin >> n >> k;
    30     for (int i = 0; i < n; i++)
    31         for (int j = 0; j < n; j++)
    32             cin >> f[i][j];
    33     getp(1); 
    34     return 0;
    35 }

    蓝桥杯 ALGO-54 简单加法(基本型)

    问题描述:

    首先给出简单加法算式的定义:

    如果有一个算式(i)+(i+1)+(i+2),(i>=0),在计算的过程中,没有任何一个数位出现了进位,则称其为简单的加法算式。

    例如:i=3时,3+4+5=12,有一个进位,因此3+4+5不是一个简单的加法算式;又如i=112时,112+113+114=339,没有在任意数位上产生进位,故112+113+114是一个简单的加法算式

    问题:给定一个正整数n,问当i大于等于0且小于n时,有多少个算式(i)+(i+1)+(i+2)是简单加法算式。其中n<10000。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n, ans;
     5 
     6 int getc(int o) {
     7     int res = 0;
     8     for (int i = 1; i <= 4; i++)
     9         res += o % 10, o /= 10;
    10     return res;
    11 }
    12 
    13 int main() {
    14     cin >> n;
    15     for (int i = 0; i < n; i++)
    16         ans += getc(i) + getc(i + 1) + getc(i + 2) == getc(3 * i + 3);
    17     cout << ans;
    18     return 0;
    19 }

    蓝桥杯 ALGO-55 排列问题

    问题描述:

    给定两个N×M的矩阵,计算其和。其中:

    N和M大于等于1且小于等于100,矩阵元素的绝对值不超过1000。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 105
     5 
     6 int n, m, o, a[MAXN][MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= n; i++)
    11         for (int j = 1; j <= m; j++)
    12             cin >> a[i][j];
    13     for (int i = 1; i <= n; i++) {
    14         for (int j = 1; j <= m; j++)
    15             cin >> o, cout << a[i][j] + o << ' ';
    16         cout << endl;
    17     }
    18     return 0;
    19 }

    蓝桥杯 ALGO-56 邮票

    问题描述:

    给定一个信封,有N(1≤N≤100)个位置可以贴邮票,每个位置只能贴一张邮票。我们现在有M(M<=100)种不同邮资的邮票,面值为X1,X2….Xm分(Xi是整数,1≤Xi≤255),每种都有N张。

    显然,信封上能贴的邮资最小值是min(X1, X2, …, Xm),最大值是 N*max(X1, X2, …,  Xm)。由所有贴法得到的邮资值可形成一个集合(集合中没有重复数值),要求求出这个集合中是否存在从1到某个值的连续邮资序列,输出这个序列的最大值。

    例如,N=4,M=2,面值分别为4分,1分,于是形成1,2,3,4,5,6,7,8,9,10,12,13,16的序列,而从1开始的连续邮资序列为1,2,3,4,5,6,7,8,9,10,所以连续邮资序列的最大值为10分。

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define MAXN 100005
     5 
     6 int n, m, o, a[MAXN], f[MAXN];
     7 
     8 int main() {
     9     cin >> n >> m;
    10     for (int i = 1; i <= m; i++)
    11         cin >> a[i];
    12     while (1) {
    13         o++;
    14         for (int i = 1; i <= m; i++)
    15             if (o >= a[i])
    16                 if (!f[o] || f[o] > f[o - a[i]] + 1)
    17                     f[o] = f[o - a[i]] + 1;
    18         if (!f[o] || f[o] > n)
    19             cout << o - 1, exit(0);
    20     }
    21     return 0;
    22 }

    蓝桥杯 ALGO-52 排列问题  

    问题描述:

    求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出现在i-1这个数后面,并保证第i行第i列为0),将这个排列看成一个自然数,求从小到大排序第K个排列。

    代码: 

          

  • 相关阅读:
    codeforces C. Cows and Sequence 解题报告
    codeforces A. Point on Spiral 解题报告
    codeforces C. New Year Ratings Change 解题报告
    codeforces A. Fox and Box Accumulation 解题报告
    codeforces B. Multitasking 解题报告
    git命令使用
    shell简单使用
    知识束缚
    php 调用系统命令
    数据传输方式(前端与后台 ,后台与后台)
  • 原文地址:https://www.cnblogs.com/jinkun113/p/13800142.html
Copyright © 2011-2022 走看看