第十二届蓝桥杯B组C/C++


前言

介绍B组里面的部分题。

一、C题(直线)

 解题思路:

利用循环枚举出每一个点, 然后利用点斜式判断直线是否唯一, 注意垂直与X轴的直线, 斜率不存在, 要在最后加上。

细节:在计算斜率,和截距时可能出现小数, 要用二者差值的绝对值是否大于1e-8,判断二者是否不相同。可以把计算出的斜率存储在一个数组中,然后排序后在判断。

代码:

#include <bits/stdc++.h>

using namespace std;

vector<pair<double, double>> v;        

int main()
{
    for(int i = 0; i < 20; i++)
    {
        for(int j = 0; j < 21; j++)
        {
            for(int k = 0; k < 20;  k++)
            {
                for(int z = 0; z < 21; z++)
                {    //找两个点 
                    int x1 = i, y1 = j, x2 = k, y2 = z;
                    if(x1 != x2)    //排除斜率为0; 
                    {
                        double a = (double)(y2 - y1)/(x2 - x1);
                        double b = (double)(y2 - a * x2);
                        v.push_back({a,b});
                    }
                }
            }
        }
    }
    int ans = 1;        //在排序后,默认第一个元素不一样
    sort(v.begin(), v.end());    //为了去重
    for(int i = 1; i < v.size(); i++)
    {
        if(fabs(v[i].first - v[i - 1].first )> 1e-6 ||    fabs(v[i].second - v[i - 1].second) > 1e-6)
        ans++;
     } 
    ans += 20;
    cout << ans << endl;    
 }

2.D货物

思路:

求出所有因子,用数组存储起来, 再写三个循环, 判断是否满足条件。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
 
 int main()
 {
     ll n = 2021041820210418;
     //求所有因数
     vector<ll> v;
     for(ll i = 1; i * i <= n; i++)
     {
         if(n % i == 0)
         {
             v.push_back(i);
             v.push_back(n/i);
         }
     }

//组合因子
           int cnt = 0;
     for(ll i = 0; i <v.size(); i++)
     {
         for(ll j = 0; j <v.size(); j++)
         {
             for(ll k = 0; k < v.size(); k++)
             {
                 if(v[i] * v[j] * v[k] == n)
                 cnt++;
             }
         }
      }
      cout << cnt << endl; 
     return 0;
 }


3E路径

 思路:

dp  动态规划:

有题知道: 1到22的路径长度是一定的, 那么1到23的min为{a[2] + length2,23 , a[3] + length3,23, ......., a[22] + length22,23}; 其中a[n]代表1到n的距离。一次类推, 得到答案。

代码:

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
 
 int gbs(int a, int b)
 {
     return (a * b) / __gcd(a,b);
 }
 int main()
 {
     int arr[2022] = {0};
     //初始化数组
    int i = 0, min = 0;
    for(i = 0; i <= 22; i++)
    {
        arr[i] = i;    //初始化1到22; 
     } 
     for(; i <= 2021; i++ )
     {
         //计算数组
         int j = 21;
         arr[i] =  arr[i - j] + gbs(i - j, i);
         //求出该下标的最小值
          min = arr[i];
          while(j>0)
          {
              if(min > arr[i - j] + gbs(i - j, i))
              {
                  min = arr[i - j] + gbs(i - j, i);
            }
            j--;
          }
     }
     cout << min << endl; 
     return 0;
  }
  

砝码问题:

题目:

 

思路:利用set容器。自动去重。

代码 :

#include <bits/stdc++.h>

using namespace std;

int main()
{
    set<int> s;
    int N = 0, w = 0;
    cin >> N; 
    for(int i = 0; i < N; i++)
    {
        cin >> w;
        vector<int> v(s.begin(), s.end());
        for(int j = 0; j < v.size(); j++ )
        {
            s.insert(v[j] + w);
            if(abs(v[j] - w) != 0)
            s.insert(abs(v[j] - w));
        }
        s.insert(w);        
    }
    cout << s.size() << endl;
    return 0;
 } 

总结:今天弄回dp, 加油!!! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值