2021蓝桥杯4月B组全部题目加分析

1.空间

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
   ll sum;
   sum=256*1024*1024*8/32;
   cout<<sum<<endl;   
   return 0;
}

2.卡片

在这里插入图片描述
模拟一下,最后是不能拼出的前一个数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10];
int main(){
   for(int i=0;i<=9;i++) a[i]=2021;
   int flag=0;
   for(int i=1;i<=100000;i++){
      int x=i;
      while(x){
       a[x%10]--;
       if(a[x%10]<0){flag=1;break;}
       x/=10;
     }
     if(flag) { cout<<i-1<<endl;break;}
   }
   return 0;
}

3.直线

在这里插入图片描述
枚举一下所有每两个点的那条直线,存到node里面然后排序判断一下精度是否符合,最后加上由于(x1!=x2)前面筛掉的21条直线,就好啦

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double eps=1e-8;
const int maxn=1e6+86;
struct node{
   double k,b;
   bool operator<(const node &ths) const {
       if(k!=ths.k) return k<ths.k;
       return b<ths.b;
   }
}a[maxn];
int main(){
   int cnt=0;
   for(int x1=0;x1<20;x1++){
      for(int y1=0;y1<21;y1++){
         for(int x2=0;x2<20;x2++){
            for(int y2=0;y2<21;y2++){
                if(x1!=x2){double k=(double)(y2-y1)/(x2-x1);
                double b=(double)y1-k*x1;
                a[++cnt]={k,b};}
            }
         }
      }
   }
   sort(a+1,a+cnt+1);
   cout<<cnt<<endl;
   int ans=0;
   for(int i=1;i<=100;i++) cout<<a[i].k<<" "<<a[i].b<<endl;
   for(int i=1;i<cnt;i++){
    if(abs(a[i].k-a[i+1].k)>eps||abs(a[i].b-a[i+1].b)>eps) ans++;
   }
   cout<<ans+21<<endl;
   return 0;
}

4.货物摆放

在这里插入图片描述
把所有n的因子全部求出来,不断枚举三个因子是否相乘可以等于n,把答案都加起来就好啦

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll>se;
int main(){
   ll n=2021041820210418;
   for(ll i=1;i*i<=n;i++){
     if(n%i==0){
        se.insert(i);
        if(n/i!=i) se.insert(n/i);
     }
   }
   int ans=0;
   for(auto a:se){
      for(auto b:se){
         for(auto c:se){
            if(a*b*c==n) ans++;
         }
      }
   }
   cout<<ans<<endl;
   return 0;
}

5.最短路径

在这里插入图片描述
后悔哭了~板子记不住

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2050;
ll dis[maxn][maxn];
struct node{
  ll to,dis;
};
vector<node>g[maxn];
struct edge{
   ll id,dis;
   bool operator<(const edge&ths)const {
       return dis>ths.dis;
   }
};
priority_queue<edge>qwq;
int vis[maxn];
void dijkstra(int n){
    qwq.push({n,0});
    while(!qwq.empty()){
        edge now=qwq.top();
        qwq.pop();
        if(vis[now.id]) continue;
        for(int i=0;i<g[now.id].size();i++){
            if(dis[n][g[now.id][i].to]>now.dis+g[now.id][i].dis){
                dis[n][g[now.id][i].to]=now.dis+g[now.id][i].dis;
                qwq.push({g[now.id][i].to,dis[n][g[now.id][i].to]});
            }
        }
        vis[now.id]=1;
    }
}
int main(){
   for(ll i=1;i<=2021;i++){
     for(ll j=i+1;j<=i+21;j++){
        if(j>2021) break;
        ll val=i*j/(__gcd(i,j));
        g[i].push_back({j,val});
        g[j].push_back({i,val});
     }
   }
   for(int i=1;i<=2021;i++){
      for(int j=1;j<=2021;j++){
        dis[i][j]=1e9;
      }
   }
   dijkstra(1);
   cout<<dis[1][2021]<<endl;
   return 0;
}

6.时间显示

小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。
小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

舍去毫秒,再随便搞一下就出来了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2050;
int main(){
  ll n;
  scanf("%lld",&n);
  n/=1000;
  n%=86400;
  int h=n/3600;
  n%=3600;
  int m=n/60;
  int s=n%60;
  printf("%02d:%02d:%02d",h,m,s);
  //新学到的关于补前导零的简洁方法
  return 0;
}

7.砝码称重

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式
输入的第一行包含一个整数 N。

第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN。

输出格式
输出一个整数代表答案。

数据范围
对于 50% 的评测用例,1≤N≤15。
对于所有评测用例,1≤N≤100,N 个砝码总重不超过 105。

解题思路:非常的像背包的那个状态,定义dp[ i ][ j ]为当前状态下,j为能达到的重量,判断是否可以达到j这个状态,对于一个砝码可以有三种状态,不取,放左边,或者放右边,那就可以解决了。

#include<iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e5+86;
int a[maxn];
int dp[120][200086];
int main(){
    int n,sum=0;
    cin>>n;
    dp[0][0]=1;
    for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
    for(int i=1;i<=n;i++){
        for(int j=0;j<=sum;j++){
           dp[i][j]=(dp[i-1][j]||dp[i-1][j+a[i]]||dp[i-1][abs(j-a[i])]);
        }
    }
    int ans=0;
    for(int i=1;i<=sum;i++){
        if(dp[n][i]) ans++;
    }
    cout<<ans<<endl;
    return 0;
}

剩下的下次再写,拜拜~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值