20240402学习总结

1、P8627 [蓝桥杯 2015 省 A] 饮料换购

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。

输入格式

输入一个整数 n,表示初始买入的饮料数量。

输出格式

输出一个整数,表示一共能够喝到的饮料数量。

数据范围

0<n<10000

思路:一个硬做的题目,没用什么方法,按照题意直接写,注意中的字母不要写错就ok

#include<iostream>
using namespace std;
int n,count,s1,s2,s3;
int main(){
	scanf("%d",&n);
	count+=n;
	while(n/3>=1){
		s1=n/3;
		s2=n%3;
		n=s1+s2;
		count+=s1;
	}
	s3=s1+s2;
	while(s3>=3){
		count+=s3/3;
		s3=s3/3+s3%3;
	}
	cout<<count<<endl;
	return 0;
} 

2、P8668 [蓝桥杯 2018 省 B] 螺旋折线

这道题目比较恶心,要找出每条边的规律,需要做到不重不漏

如果对于每条边只是简单的判断x和y的关系容易造成重复,最好是列出一个方程,这样比较安全

#include<iostream>
using namespace std;
long long x,y,sum;
int main(){
	cin>>x>>y;
	if(y>=abs(x)){
		//这种情况是上面向右边y=-x,y都是一样的 
		//这条边上的特殊点的长度是2y*(2y-1)
		sum=2*y*(2*y-1)+x+y; 
	}
	else if(x>=abs(y)&&x>0){
		//这种情况是右边向下的边 
		//特殊点y==x 长度是2*x*2*x
		sum=2*x*2*x+(x-y); 
	}
	else if(x>y&&y<0){
		//这种情况是下面向左的边,y不变 
		//特殊点是y=-x长度是(x-y)*(x-y+1)
		sum= 2*y*(2*y-1)+(-y-x); 
	}
	else{
		//这种是左向上的边,x不变
		//特殊点y=x+1  
		sum=(2*x+1)*(2*x+1)+(y-x-1);
	}
	cout<<sum<<endl;
	return 0;
}

3、P8748 [蓝桥杯 2021 省 B] 时间显示

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。

现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要 显示出时分秒即可,毫秒也不用显示,直接舍去即可。

给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

输入格式

输入一行包含一个整数,表示时间。

输出格式

输出时分秒表示的当前时间, 格式形如 HH:MM:SSHH:MM:SS, 其中 HHHH 表示时, 值 为 00 到 23,MM23,MM 表示分。值为 00 到 5959。SSSS 表示秒, 值为 00 到 5959。时、分、秒不足两位时补前导 0 。

思路:小时=t%86400/3600

分钟=t%3600/60

秒=t%60

#include<iostream>
using namespace std;
int main(){
	long long t;
	cin>>t;
	t=t/1000;
	int h=t%86400/3600;
	int m=t%3600/60;
	int s=t%60;
	printf("%02d:%02d:%02d\n",h,m,s);
	return 0;
}

4、P8781 [蓝桥杯 2022 省 B] 修剪灌木

爱丽丝要完成一项修剪灌木的工作。

有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 00 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

灌木每天从早上到傍晩会长高 11 厘米, 而其余时间不会长高。在第一天的早晨, 所有灌木的高度都是 00 厘米。爱丽丝想知道每棵灌木最高长到多高。

输入格式

一个正整数 N ,含义如题面所述。

输出格式

输出 N 行, 每行一个整数, 第行表示从左到右第 i 棵树最高能长到多高。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n;
	cin>>n;
	int maxn[n]={0};
	for(int i=1;i<=n;i++){
		maxn[i]=max(2*(n-i),2*(i-1));
	}
	for(int i=1;i<=n;i++)
	  cout<<maxn[i]<<endl;
	return 0;
} 

5、P8723 [蓝桥杯 2020 省 AB3] 乘法表

注意处理最后10转换成A之类的问题就ok

#include<iostream>
using namespace std;
int main(){
	int n,k=0;
	char oo;
	int m[100]={0};
	cin>>n;
	for(int i=1;i<n;i++){
		for(int j=1;j<=i;j++){
			//cout<<i<<"*"<<j<<"=";
			if(i<10)  cout<<i;
			else  oo='A'+i-10,cout<<oo;
			cout<<'*';
			if(j<10)  cout<<j;
			else oo='A'+j-10,cout<<oo;
			cout<<"=";
			int s=i*j;
			k=0;
			if(s<n)  //cout<<s;
			{
				if(s<10)  cout<<s;
				else oo='A'+s-10,cout<<oo;
			}
			else {
				while(s/n!=0){
					m[k]=s%n;
					s=s/n;
					k++;
				}
				//cout<<s;
				if(s<10)  cout<<s;
               else  oo='A'+s-10,cout<<oo;
				for(int p=k-1;p>=0;p--) {
					if(m[p]<10)  cout<<m[p];
					else  oo='A'+m[p]-10,cout<<oo;
				}
				
			}
			cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}

6、P8662 [蓝桥杯 2018 省 AB] 全球变暖

是你最喜欢的bfs问题哟,看看你有没有忘记 (30分钟之后搞完了,事实证明我已经忘得一干二净了)基本思路是,先把这块连通的岛上的全部陆地数出来,再数会变成海洋的陆地数量,两者详见就可以

#include<iostream>
#include<queue>
using namespace std;
const int N=1009;
int n,total,sea,count;
long long ans;
char f[N][N];
int visit[N][N];
struct point{
	int x;
	int y;
};
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int check(int x,int y){
	for(int i=0;i<4;i++){
		if(f[x+dx[i]][y+dy[i]]=='.') return 1;
	}
	return 0;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
		  cin>>f[i][j];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(f[i][j]=='#'&&visit[i][j]==0) {
				ans++;
				visit[i][j]=1;
				total=1;
				sea=0;
				if(check(i,j)==1) sea++;
				point cur,next;
				queue<point> que;
				cur.x=i;
				cur.y=j;
				que.push(cur);
				while(!que.empty()){
					cur=que.front() ;
					que.pop();
					for(int k=0;k<4;k++){
						int nx=cur.x+dx[k];
						int ny=cur.y+dy[k];
						if(nx<1||nx>n||ny<1||ny>n)  continue;
						if(f[nx][ny]=='#'&&visit[nx][ny]==0){
							visit[nx][ny]=1;
							next.x=nx;
							next.y=ny;
							total++;
							if(check(next.x,next.y)==1)  sea++;
							que.push(next); 
						}
					}
				} 
				if(total==sea)  count++;
			}
			
		}
	}
	cout<<count<<endl;
	return 0;
}

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值