第十四届蓝桥杯大赛题解

A题(填空)日期统计

dfs+剪枝

在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;

const int N=3e8+10;

int n,m,ans,k;
int a[110],vis[N];

bool check(int date) {
   
	if(vis[date])return false;
	vis[date]=1;
	int mm=date/100%100;
	int dd=date%100;
	if(mm<1||mm>12)return false;
	if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12) {
   
		if(dd>=1&&dd<=31)return true;
	} else if(mm==2) {
   
		if(dd>=1&&dd<=28)return true;
	} else if(dd>=1&&dd<=30)return true;

	return false;
}


void dfs(int x,int cnt,int date) {
    //传入当前位置,第几位,日期

	if(x==100)return ;
	if(cnt==8) {
   
		if(check(date))ans++;
		return ;
	}

	if((cnt==0&&a[x]==2)||(cnt==1&&a[x]==0)||(cnt==2&&a[x]==2)||(cnt==3&&a[x]==3)||(cnt==4&&a[x]>=0&&a[x]<=1)||(cnt==5&&a[x]>=0&&a[x]<=9)||(cnt==6&&a[x]>=0&&a[x]<=3)||(cnt==7&a[x]>=0&&a[x]<=9))
		dfs(x+1,cnt+1,date*10+a[x]);//合法可以选

	dfs(x+1,cnt,date);//不选

}




int main() {
   


	/*
	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
	*/

	for(int i=0; i<100; i++)cin>>a[i];
	dfs(0,0,0);
	cout<<ans;

	return 0;
}

答案:235

B题(填空)01串的熵

在这里插入图片描述

考察枚举,遇见这种式子不要慌,慢慢分析推导

注意浮点数的处理方式每次用1.0乘上一个int数转为浮点数

注意log函数的使用

注意结果的判断方式

在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;

const int N=23333333;

int n,m,k;

double ans=11625907.5798,esp=1e-4;



int main() {
   


     for(int m=0;m<=N/2;m++){
   //枚举0的个数 
     	 n=N-m;//1的个数
		 double res=-1.0*m*m/N*log2(1.0*m/N)-1.0*n*n/N*log2(1.0*n/N);
		 if(fabs(res-ans)<esp){
   
		 	cout<<m<<endl;
			 return 0; 
		 } 
	 }




	return 0;
}

C题冶炼金属

在这里插入图片描述

二分转换率

#include <bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;

const int N=1e4+10;

int n,m,k,ans;
int a[N],b[N];


bool  check_min(int v) {
   
	for(int i=1; i<=n; i++) {
   
		if(a[i]/v>b[i])return false;
	}
	return true;
}

bool check_max(int v) {
   
	for(int i=1; i<=n; i++) {
   
		if(a[i]/v<b[i])
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值