2022蓝桥杯省赛b组c++个人题解记录

只会暴力。
1.这题我没问题吧···

//九进制正整数 (2022)9 转换成十进制等于多少?
#include<bits/stdc++.h>
using namespace std;
int main(){
	unsigned long long n;
	n=2+2*9+0*9*9+2*9*9*9;
	cout<<n;
	return 0;
}

2.有争议。但从打牌的角度,123,234是顺子,牌里没0所以012不行,打牌出123和321没区别,所以就这样了0v0。不多讨论了,咋说全看出题人。

//在整个 2022年份中,一共有多少个顺子日期(123、456、、)。
#include<bits/stdc++.h>
using namespace std;
int main(){
	//0123
	//1123
	//1230
	//1231
	return 0;
}

3.这题我没问题吧···

/*
周一开始努力刷题
周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。
第几天实现做题数大于等于 n 题?
1 ≤ a, b, n ≤ 10^18
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
	unsigned long long a,b,n,bj=1,day=0,sum=0;
	cin>>a>>b>>n;
	while(sum<n){
		day++;
		if(bj<6){
			sum+=a;
		}else{
			sum+=b;
		}
		bj++;
		if(bj>7){
			bj=1;
		}
	}
	cout<<day;
	return 0;
}

4.找了找规律,写了半天没写对,给我整的蛋疼

/*
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌
木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,
每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开
始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的
早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
1 < N ≤ 10000
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;
	bool flag=1,ou=1;
	cin>>n;
	int tree[n];
	m=n-1;
	for(int i=0;i<n;i++){
		tree[i]=2*m;
		if(flag){
			m--;
		}else{
			m++;
		}
		if(n%2==1 && m<n/2){
			m++;
			flag=0;
			m++;
		}else if(n%2==0 && m<n/2){
			if(ou){
				m++;
				ou=0;
			}else{
				m++;
				flag=0;
				m++;
			}
		}
	}
	for(int i=0;i<n;i++){
		cout<<tree[i]<<endl;
	}
	return 0;
}

5.这题理解题意就费了很多事······两个数对应位置数字的最大值就是要找的进制啦,我猜的。试着用了对大数求余数的那个定理,也不知道写对没qwq

/*
X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某
种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则
X 进制数 321 转换为十进制数为 65。
现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确
定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进
制。请你算出 A - B 的结果最小可能是多少。
//
第一行一个正整数 N,含义如题面所述。
第二行一个正整数 Ma,表示 X 进制数 A 的位数。
第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
第四行一个正整数 Mb,表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
请注意,输入中的所有数字都是十进制的。
//
输出一行一个整数,表示 X 进制数 A - B 的结果的最小可能值转换为十进
制后再模 1000000007 的结果。
//
2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.
*/
#include<bits/stdc++.h>
using namespace std;
const unsigned int mod=1000000007;
int main(){
	int n;//进制 
	int ma;//a的位数,之后接每位数字 
	int mb;//b的位数,之后接每位数字 
	cin>>n>>ma;
	int na[ma];
	for(int i=0;i<ma;i++){
		cin>>na[i]; 
	}
	cin>>mb;
	int nb[mb]; 
	for(int i=0;i<mb;i++){
		cin>>nb[i]; 
	}
	//记录最小进制 
	int min[ma];
	int cha,mi;
	cha=ma-mb; 
	for(int i=ma-1;i>=0;i--){
		if(i-cha>=0){
			mi=max(na[i],nb[i-cha])+1;
			if(mi<2){
				mi=2;
			}
			min[i]=mi;
		}else{
			mi=na[i]+1;
			if(mi<2){
				mi=2;
			}
			min[i]=mi;
		}
	} 
	//大数预警 
	unsigned long long ans=0;
	unsigned long long suma=0,sumb=0,t,base=1;
	for(int i=ma-1;i>=0;i--){
		base=1;
		for(int j=1;j<=(ma-1-i);j++){
			base*=min[ma-j];
			base%=mod;
		}
		t=na[i]%mod; 
		suma+=(t*base)%mod;
	}
	suma%=mod;
	for(int i=mb-1;i>=0;i--){
		base=1;
		for(int j=1;j<=mb-1-i;j++){
			base*=min[ma-j];
			base%=mod;
		}
		t=nb[i]%mod; 
		sumb+=(t*base)%mod;
	}
	sumb%=mod;
	cout<<(suma-sumb)%mod;
	return 0;
}

6.写到这个时候时间不多啦,暴力!突然发现里面留着测试用的句子,不记得交的时候删了没,估计没删,焯。

/*
给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大
N × M) 满足子矩阵中所有数的和不超过给定的整数 K?
1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.
*/
//运行时间可能超时!!! 
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	int num[n][m];
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>num[i][j];
		}
	}
	int sum=0,times=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){//开始点位 
			cout<<"when["<<i<<","<<j<<"]"<<endl;
			for(int x=i;x<n;x++){
				for(int y=j;y<m;y++){//结束点位
					cout<<"-to["<<x<<","<<y<<"]"<<endl;
					sum=0;
					cout<<"sum=";
					for(int a=i;a<=x;a++){
						for(int b=j;b<=y;b++){
							cout<<"+"<<num[a][b];
							sum+=num[a][b];
						}
					} 
					cout<<"="<<sum<<endl;
					if(sum<=k)
						times++;
				}
			} 
		}
	}
	cout<<times;
	return 0;
}

7.我是这么找了个规律:n为1的时候有一种方法,n为2的时候有一种方法(独特的,排除两个1排在一起),n为3有2种方法(独特的,不含1,2),然后dfs······唉,鬼知道对不对,面向样例编代码了属于是

/*
积木画
,1 ≤ N ≤ 10000000 
*/
#include<bits/stdc++.h>
using namespace std;
int n,ff=0;
void digui(int sum,int mj){
	int i=1;

			if(mj+i<=n){
				sum*=1;
				mj+=i;
				if(mj==n){
					ff+=sum;
				}else{
					digui(sum,mj);
					mj-=i;
					sum/=1;	
				}
			}
			i++;

			if(mj+i<=n){
				sum*=1;
				mj+=i;
				if(mj==n){
					ff+=sum;
				}else{
					digui(sum,mj);
					mj-=i;
					sum/=1;	
				}
			}
			i++;
	
			if(mj+i<=n){
				sum*=2;
				mj+=i;
				if(mj==n){
					ff+=sum;
				}else{
					digui(sum,mj);
					mj-=i;
					sum/=2;	
				}
			}
}
int main(){
	cin>>n;
	digui(1,0);
	cout<<ff;
	return 0;
}

8.递归,全~都可以炸完。

/*
输入的第一行包含两个整数 n、m.
接下来的 n 行,每行三个整数 xi, yi,ri,表示一个炸雷的信息。
再接下来的 m 行,每行三个整数 xj, yj,rj,表示一个排雷火箭的信息。
0 ≤ x, y ≤ 109, 0 ≤ n, m ≤ 5 × 104, 1 ≤ r ≤ 10.
*/
#include<bits/stdc++.h>
using namespace std;
int n;
int dl[100000][4];
int hj[100000][3];
void judge(int j){
	for(int x=0;x<n;x++){
		if(dl[x][0] && sqrt((dl[j][1]-dl[x][1])*(dl[j][1]-dl[x][1])+(dl[j][2]-dl[x][2])*(dl[j][2]-dl[x][2]))<=dl[j][3]){
			dl[x][0]=0;
			judge(x);
		}
	}
}
int main(){
	int m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		dl[i][0]=1;
		cin>>dl[i][1];
		cin>>dl[i][2];
		cin>>dl[i][3];
	}
	for(int i=0;i<m;i++){
		cin>>hj[i][0];
		cin>>hj[i][1];
		cin>>hj[i][2];
	}
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if(dl[j][0] && sqrt((dl[j][1]-hj[i][0])*(dl[j][1]-hj[i][0])+(dl[j][2]-hj[i][1])*(dl[j][2]-hj[i][1]))<=hj[i][2]){
				dl[j][0]=0;
				judge(j);
				
			}
		}
	}
	int sum=0;
	for(int i=0;i<n;i++){
		if(dl[i][0]==0){
			sum++;
		}
	}
	cout<<sum;
	return 0;
}

9.dfs。靠,他都提示取模了,我为什么没有用ull存数?为什么没有用我的求余公式?我是沙壁!

/*
酒壶中有酒 2 斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花,
他正好把酒喝光了
壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇
花是不合法的
*/
#include<bits/stdc++.h>
using namespace std;
int n,m;//店,花 
int ff=0;
int mod=1000000007;
void digui(int j){

	if(n>0){
		j*=2;
		n--;
		digui(j);
		n++;
		j/=2;
	}
	if(m>0){
		if(j!=0){
			j-=1;
			m--;
			digui(j);
			m++;
			j+=1;	
		}
	}	
	if(n==0 && m==0 && j-1==0){
		ff++;
	}
}
int main(){
	cin>>n>>m;
	m=m-1;
	int jiu=2;
	digui(jiu);
	cout<<ff%mod;
	return 0;
}

10.不会

/*
这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的
高度为 hi.
他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。魔法可以对连续的一
段相同高度的竹子使用,假设这一段竹子的高度为 H,那么使用一次魔法可以
把这一段竹子的高度都变为 [ sqrt([ H/2 ] + 1 ) ],其中 [x] 表示对 x 向下取整。小明想
知道他最少使用多少次魔法可以让所有的竹子的高度都变为 1。
第一行为一个正整数 n,表示竹子的棵数。
第二行共 n 个空格分开的正整数 hi,表示每棵竹子的高度。
n ≤ 2 × 10^5, hi ≤ 10^18
*/
#include<bits/stdc++.h>
using namespace std;
int n;
unsigned long long bb[1000000];
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>bb[i];
	}
	
	return 0;
}

总结:吐了,吐了,吐了。再看一遍自己的题解就觉得自己是霎碧,唉,考前做了几天题已经做麻了,可能真的没这个能力?可是找工作好像也要考算法啊qwq再说这才算个锤子算法,还没到难的地方呢。大三了,明年也不会再考了,就这样吧,不想学了。
去年省二,今年口号省二不亏省一血赚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值