第十二届蓝桥杯大赛软件类省赛C++研究生组

题目

  • A 卡片(5分,√)
  • B 直线(5分,√)
  • C 货物摆放(10分,√)
  • D 路径(10分,√)
  • E 回路计数(15分,√)
  • F时间显示(15分,√)
  • G砝码称重(20分,√)
  • H 异或数列(20分)
  • I 双向排序(25分)
  • J 分果果(25分)

题目是全的,但是由于能力有限,后面有题目没做,分值和完成情况在题目后说明

A 卡片(5分,√)

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题

#define _CRT_SECURE_NO_WARNINGS
#include 
using namespace std;

int main()
{
   
    int arr[10] = {
   0};
    for(int i = 0; i < 10; i ++){
   
        arr[i] = 2021;
    }
    int minx = 2021;
    int n = 1;
    int flag;
    while(minx > 0){
   
        int m = n;
        while(m > 0 ){
   
            if(minx == 0){
   
                n --;
                break;
            }
            int tmp = m % 10;
            arr[tmp] -= 1;
            minx = min(minx, arr[tmp]);
            m /= 10;
        }
        n ++;
    }
    printf("%d\n", n);
    return 0;
}

B 直线(5分,√)

题目描述
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。

给定平面上2×3个整点{(x,y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z},即横坐标 是0到1 (包含0和1)之间的整数、纵坐标是0到2 (包含0和2)之间的整数 的点。这些点一共确定了 11 条不同的直线。

给定平面上20×21个整点{(x,y)|0 ≤ x < 20,0 ≤ y < 21,x ∈ Z,y ∈ Z},即横 坐标是0到19 (包含0和19)之间的整数、纵坐标是0到20 (包含0和20)之 间的整数的点。请问这些点一共确定了多少条不同的直线。

利用两点式方程:(y - y1) / (x - x1) = (y2 - y1) / (x2 - x1),化简后得:
y = [(y2 - y1) / (x2 - x1)] *x + (x1 * y2 - x2 * y1) / (x2 - x1),
从而得到斜率和截距。
注意:不能用y = kx + b,如:先用两点求出斜率k,再将斜率k和任一点带入求得b,这样会因为精度不准而导致结果错误。
int a = 6;
double b = 1.99;
double c = 1.999999999999;
double d = a * 1.0 / b;
double e = a * 1.0 / c;
cout << "a / b = " << d << “\n”; //3.01508
cout << "(a / b) * 3 = " << d * 3 << “\n”; // 9.04523
cout << "a / c = " << e << “\n”; //3
cout << "(a / c) * 3 = " << e * 3 << “\n”; //9

#define _CRT_SECURE_NO_WARNINGS
#include 
using namespace std;

vector<pair<int, int>> all; //存放所有的点
set<pair<double, double>> res; //存放所有直线的斜率和截距

int main()
{
   
    //获得所有的点
    for(int i = 0; i < 20; i ++){
   
        for(int j = 0; j < 21; j ++){
   
            all.push_back(make_pair(i, j));
        }
    }
    //每两个点组成一条直线
    for(int i = 0; i < all.size(); i ++){
   
        int x1 = all[i].first;
        int y1 = all[i].second;
        for(int j = 0; j < all.size(); j ++

你可能感兴趣的:(算法练习,算法,蓝桥杯)