蓝桥杯2023省赛刷题1

文章分享了多个编程竞赛中的题目,涉及基础数据结构(如检查、日期计算)、概率统计(01串熵)、数学运算(阶乘、与或异或)、动态规划(分糖果)、图形处理(棋盘)、优化问题(平均、翻转填充)、数学逻辑(冶炼金属)、组合策略(有奖问答)以及飞机降落问题的解决方案。
摘要由CSDN通过智能技术生成

蓝桥杯2023省赛刷题

by lqx

幸运数字

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
int cnt=0;
bool check(int x,int base){
      int k=x,sum=0;
      while(k){
        sum+=k%base;
        k/=base;
      }
      return x%sum==0;
}
signed main(){
    for(int i=1;;i++){
      if(check(i,2)&&check(i,8)&&check(i,10)&&check(i,16))
      cnt++;
      if(cnt==2023){
        cout<<i;
        return 0;
      }
    }
}

特殊日期

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
int main(){
  int day=0;
  int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  for(int i=2000;i<2000000;i++){//遍历年
     if((i%4==0&&i%100!=0)||i%400==0)arr[2]=29;
     for(int j=1;j<=12;j++)//遍历月
      for(int k=1;k<=arr[j];k++)//遍历日
         if(i%j==0&&i%k==0)day++;
  }
  //cout<<day+1;//2000000-1-1也满足
  cout<<35813063;//运行超时,直接cout
}

01串的熵

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
  int x=23333333;
  for(int i=0;i<x/2;i++){//0<1的个数,遍历0只需遍历到一半
    double a=i*1.0/x;
    double b=(x-i)*1.0/x;
    double s=0;
    s=-a*log2(a)*i-b*log2(b)*(x-i);
    if(fabs(s-11625907.5798)<0.0001){//浮点数不能直接判断
      cout<<i;
      return 0;
    }
  }
}

阶乘求和

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int p=1e9;//一个数阶乘因子2一定不小于5的个数,2*5=10;
signed main(){//5 10 15 20 25 30 35 40 贡献了9个因数5
    int s=1,sum=0;
    for(int i=1;i<=40;i++){
      s=s*i%p;
      sum=(sum+s)%p;
    }
    cout<<sum;
}

与或异或

请添加图片描述

#include <bits/stdc++.h>
#define int long long
using namespace std;
bool a[20]={1,0,1,0,1};
bool f(bool a,bool b,int op) {
    if (op==0) return a&b;
    else if (op==1) return a|b;
    else return a^b;
}
signed main(){
    int res=0;
    int e=pow(3,10);
    for (int i=0;i<e;i++) {
        int temp=i;
        a[5]=f(a[0],a[1],temp%3);
        temp/=3;
        a[6]=f(a[1],a[2],temp%3);
        temp/=3;
        a[7]=f(a[2],a[3],temp%3);
        temp/=3;
        a[8]=f(a[3],a[4],temp%3);
        temp/=3;
        a[9]=f(a[5],a[6],temp%3);
        temp/=3;
        a[10]=f(a[6],a[7],temp%3);
        temp/=3;
        a[11]=f(a[7],a[8],temp%3);
        temp/=3;
        a[12]=f(a[9],a[10],temp%3);
        temp/=3;
        a[13]=f(a[10],a[11],temp%3);
        temp/=3;
        a[14]=f(a[12],a[13],temp%3);
        if(a[14]) res++;
    }
    cout<<res;
}

分糖果

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
int ans = 0;
void dfs(int d,int x,int y){
  if(d>7){
    if(x==0&&y==0)ans++;
    return;
  }
  for(int i=0;i<=x;i++)
    for(int j=0;j<=y;j++){
    if(i+j<2||i+j>5)continue;
    dfs(d+1,x-i,y-j);
    }
}
int main(){
  dfs(1,9,16);
  cout<<ans;
}

棋盘

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2009;
int a[N][N],d[N][N],n,m;
signed main(){
    cin>>n>>m;
    while(m--){
      int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
      d[x1][y1]+=1;
      d[x2+1][y1]-=1;
      d[x1][y2+1]-=1;
      d[x2+1][y2+1]+=1;
    }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+d[i][j];

    for(int i=1;i<=n;i++){
      for(int j=1;j<=n;j++){
        cout<<(a[i][j]%2==0?0:1);
      }
      cout<<'\n';
    } 
}

平均

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+9;
typedef pair<int,int> PII;
#define x first
#define y second
PII a[N];// x cost y num
int n,cnt,num[15],sum;
signed main(){
  cin>>n;
  cnt=n/10;
  for(int i=1;i<=n;i++){
    cin>>a[i].y>>a[i].x;
    num[a[i].y]++;
  }
  sort(a+1,a+1+n);
  for(int i=1;i<=n;i++){
    if(num[a[i].y]>cnt){
      sum+=a[i].x;
      num[a[i].y]--;
    }
  }
  cout<<sum;
}

翻转

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int T;cin>>T;
    while(T--){
      string s,t;cin>>s>>t;
      bool ok=true;int ans=0;
      for(int i=0;i<s.size();i++){
          if(s[i]!=t[i])
            if(s[i-1]==s[i+1]){
              ans++;
              s[i]=t[i];
              }
            else if(!i||i==s.size()-1||s[i]==s[i+1])ok=false;
      }
    if(ok)cout<<ans<<'\n';
    else cout<<-1<<'\n';
    }
}

填充

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    string s;cin>>s;
    int ans=0;
    for(int i=0;i<s.size()-1;i++){
      if(s[i]==s[i+1]||s[i]=='?'||s[i+1]=='?'){
        ans++;
        i++;//连跳两位
      }
    }
    cout<<ans;
}

冶炼金属

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
    int n;cin>>n;
    int maxx=INT_MAX,minx=0;
    while(n--){
      int a,b;cin>>a>>b;
      maxx=min(maxx,a/b);//最小上界
      minx=max(minx,(a/(b+1))+1);//最大下界
    }
    cout<<minx<<' '<<maxx;
}

有奖问答

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
int ans=0;
void dfs(int k,int sum){
  if(k==31||sum==100)return;
  if(sum==70)ans++;
  dfs(k+1,sum+10);
  dfs(k+1,0);
}
signed main(){
    dfs(0,0);
    cout<<ans;
    //cout<<8335366;
}

飞机降落

请添加图片描述

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+9;
int T,n,t[N],d[N],l[N],vis[15];
bool ok;
void dfs(int cnt,int last){//last 此前所有飞机降落所需时间
  if(cnt==n){
    ok=true;
    return;
  }
  for(int i=0;i<n;i++){
    if(!vis[i]&&t[i]+d[i]>=last){
      vis[i]=1;
      dfs(cnt+1,max(last,t[i])+l[i]);
      vis[i]=0;
    }
  }
}
signed main(){
  cin>>T;
    while(T--){
      cin>>n;
      for(int i=0;i<n;i++)cin>>t[i]>>d[i]>>l[i];
      ok=false;
      memset(vis,0,sizeof(vis));
      dfs(0,0);
      cout<<(ok?"YES\n":"NO\n");
    }
}

日期统计

请添加图片描述

#include <stdio.h>
int main() {
    int a[100] = {
        5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
        5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
        2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
        8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
        1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3 };
    int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int ans = 0;
    for (int i = 1; i <= 12; ++i)//遍历月
        for (int j = 1; j <= month[i]; ++j){//遍历日
            int s[8] = {2, 0, 2, 3, i / 10, i % 10, j / 10, j % 10};
            int k = 0;
            for (int t = 0; t < 100; ++t) 
                if (a[t] == s[k]){
                    ++k;
                    if (k == 8){
                        ans++;
                        break;
                    }
                 }
        }
    printf("%d\n",ans);
}
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值