蓝桥杯 2023 C++ B组 (个人代码,可能有小错误)

Posted Henry_WYH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯 2023 C++ B组 (个人代码,可能有小错误)相关的知识,希望对你有一定的参考价值。


A题直接枚举即可,枚举日期,暴力匹配

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool check(string t)
	if(t.substr(0, 4)!="2023") return false;
	string mon = t.substr(4, 2);
	string day = t.substr(6, 2);
	int m = (mon[0]-'0')*10+(mon[1]-'0');
	int d = (day[0]-'0')*10+(day[1]-'0');
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
		if(d>=1&&d<=31) return true;
	else if(m==2)
		if(d>=1&&d<=28) return true;
	else if(m==4||m==6||m==9||m==11)
		if(d>=1&&d<=30) return true;
	
	return false;
;

string p="",s="";
int ans = 0, n;

string mon[]="01","02","03","04","05","06","07","08","09","10","11","12";
string day[]="01","02","03","04","05","06","07","08","09","10",
"11","12","13","14","15","16","17","18","19","20",
"21","22","23","24","25","26","27","28","29","30","31";
int md[]=31,28,31,30,31,30,31,31,30,31,30,31;

bool check(string t,string s)
	int j=0;
	for(int i=0;i<t.size();++i)
		if(j==s.size()) return true;
		if(t[i]==s[j]) j++;
	
	return j==s.size();


void solve()
	while(cin >> s)
		p += s;
	
	// cout << p << endl;
	n=p.size();
	string t = "2023";
	for(int i=0;i<12;++i)
		for(int j=0;j<md[i];++j)
			string N = t + mon[i] + day[j];
			if(check(p, N)) 
				ans ++;
			
		
	
	cout<<ans<<endl;


int main()
	solve();
	return 0;

答案:


可以看出香浓信息熵有单调性(在0不超过1这个前提下)
因此直接二分即可,顺便输出一下结果对应的函数值

#include<bits/stdc++.h>
using namespace std;
#define int long long
double p(int x,int y) //x 0 y 1
	double P0 = 1.0*x/(x+y);
	double P1 = 1.0*y/(x+y);
	return -1.0*x*x/(x+y)*log2(P0)-1.0*y*y/(x+y)*log2(P1);


void solve()
	int n = 23333333;
	int l=1, r=(n-1)/2;
	double PP = 11625907.5798;
	while(l<r)
		int mid = (l+r)>>1;
		double t = p(mid, n-mid);
		if(t<PP) l=mid+1;
		else r=mid;
	
	cout << l << endl;
	
	l=11027421;
	printf("%.5lf", p(l, n-l));


signed main()
	solve();
	return 0;


貌似可以直接O(1)算,但是我选择直接二分

二分的正确性在保证有解的前提下成立

#include<iostream>
#include<vector>
using namespace std;
//V:normal -> 1:X
void solve()
	int n;
	cin >> n;
	long long x,y,X=1e9,Y=0;
	vector<pair<int,int>> vec;
	for(int i=0;i<n;++i)
		cin >> x >> y;
		vec.push_back(x,y);
	
	auto check=[&](long long x)->bool
		for(auto u:vec)
			if(u.first/x < u.second) return false;
		
		return true;
	;
	long long l=1,r=1e9;
	while(l<r)
		long long mid=(l+r+1)>>1;
		if(check(mid)) l=mid; // x/mid >= y
		else r=mid-1;
	
	Y=l;
	auto find=[&](long long x)->bool
		for(auto u:vec)
			if(u.first/x > u.second) return false;
		
		return true;
	;
	l=1,r=1e9;
	while(l<r)
		long long mid=(l+r)>>1;
		if(find(mid)) r=mid;
		else l=mid+1;
	
	X=l;
	cout<<X<<" " << Y<<endl;


int main()
	solve();
	return 0;

顺便跑了几组对拍:

N ≤ \\le 10 直接搜,不要想什么贪心

#include<iostream>
#include<vector>
#include<array>
using namespace std;

bool vis[20];
int n;

bool dfs(int num,int now, vector<array<int,3>>& vec)
	if(num==n)
		return true;
	
	int flag = 0;
	for(int i=0;i<n;++i)
		if(!vis[i])
			if(now>vec[i][0]+vec[i][1]) return false;
			vis[i] = true;
			flag |= dfs(num+1, now+vec[i][2], vec);
			vis[i]=false;
		
	
	return flag;


void solve()
	cin >> n;
	for(int i=1;i<=n;++i) vis[i] = 0;

	vector<array<int,3>> vec;
	for(int i=0;i<n;++i)
		int x,y,z;
		cin >> x >> y >> z;
		vec.push_back(x,y,z);
	
	bool res = dfs(0, 0, vec);
	cout<<(res?"YES":"NO")<<"\\n";


int main()
	ios::sync_with_stdio(false);
	cin.tie(0);

	int _=1; cin >>_;
	while(_--) solve();
	return 0;

/*
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
*/


删最少数使得他是接龙序列,即求原序列的最大接龙子序列,然后用n减去。
最大接龙子序列求法:DP
但是我们发现转移类型一共只有9种1~9结尾的数字
因此我们可以开一个数组f[i]表示前i个数字,以第i个结尾的最大接龙子序列。
再开一个数组bac[1~9]表示 以1~9结尾的最大接龙子序列
每次用第i个数组开头的字母对应的数组更新f[i],然后再用f[i]反过来更新bac即可
细节看代码

#include<iostream>
#include<vector>
#include<array>
#include<string>
using namespace std;

int n;

void solve()
	cin >> n;
	vector<string> vec;
	for(int i=0;i<n;++i)
		string t;
		cin >> t;
		vec.push_back(t); 
	
	vector<int> bac(10); //1,2,3....
	vector<int> f(n+1, 0);
	int ans = 0 ;
	for(int i=0;i<n;++i)
		f[i]=max(1, bac[vec[i][0]-'0']+1);
		ans=max(ans, f[i]);
		bac[vec[i].back()-'0'] = 
		  	max(bac[vec[i].back()-'0'], f[i]);
	
	cout << n-ans << endl;


int main()
	ios::sync_with_stdio(false);
	cin.tie(0);

	int _=1; 
	// cin >>_;
	while(_--) solve();
	return 0;


先用边缘的海水进行bfs求出"真的海水",然后再对所有岛屿进行BFS,此时BFS的时候非真的海水可以直接识别为陆地然后入队。
两遍BFS得到答案。

#include<iostream>
#include<vector>
#include<array>
#include<string>
#include<queue>
#define x first
#define y second
using namespace std;

int n,m;
char G[60][60];
int vis[60][60], g[60][60], water[60][60];

int d[][2]=1,0,0,1,-1,0,0,-1;
int mov[][2]=1,0,-1,0,0,1,0,-1,1,-1,
				1,1,-1,-1,-1,1;

void solve()
	cin >> n >> m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			vis[i][j] = g[i][j] = water[i][j] = 0;
		
	

	for(int i=1;i<=n;++i)
		cin >> (G[i]+1);
		for(int j=1;j<=m;++j)
			g[i][j] = G[i第十届蓝桥杯C/C++ B组省赛题解
  • 第十一届蓝桥杯7月场次b组题解
  • 第十一届蓝桥杯省赛B组(C/C++组)(第二场)
  • 第十二届蓝桥杯(省赛)(C/C++大学B组)
  • 以上是关于蓝桥杯 2023 C++ B组 (个人代码,可能有小错误)的主要内容,如果未能解决你的问题,请参考以下文章

    蓝桥杯c++选拔大赛A组与B组啥区别?

    蓝桥杯c++选拔大赛A组与B组啥区别?

    蓝桥杯2023JavaB组

    2023年第十四届蓝桥杯将至来看看第十二届蓝桥杯javaB组题目如何

    第十三届蓝桥杯C++ B组 不完全题解

    十三届蓝桥杯省赛C++ B组