第十届蓝桥杯省赛A组

试题 A: 平方和
【问题描述】 :
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574,平方和是 14362。 注意,平方和是指将每个数分别平方后求和。
请问,在 1 到 2019 中,所有这样的数的平方和是多少?

#include"stdio.h"
int fun(long long value) 
{     
   long long  x=0;
   x=value;
	while(x!=0)
	{   int stemp;
		 stemp =x%10;
		 x=x/10;
		if(stemp==2||stemp==0||stemp==1||stemp==9) 
		{
			
			return value*value; 
		}
	
	 } 
	 
	return 0 ;
	
}
int main()
{
	int i;
	long long sum=0;
	for (i=1;i<=2019;i++)
	{
		if (fun(i))
		{
		   	
			sum=sum+fun(i);
		}
	}
   printf("%lld",sum);
	return 0;
 } 

答案:2658417853
试题 B: 数列求值
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
只要求最后四位数字的问题,相当于求答案对10000取模

#include"stdio.h"
int main()
{
	long long int i;
	int a=1,b=1,c=1,d=3;
	for (i=5;i<=20190324;i++)//从第5项开始平均,滑动。
	{
	a=b; 
	b=c;
	c=d;
	d=a+b+c;
	if(d>=10000) 
	{
		d=d%10000;//取最后四位 
	}
	} 
	printf("%lld ",d);
	return 0;
}

答案:4659
试题 C: 最大降雨量
【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。 这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个 数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使 用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术 施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
在这里插入图片描述

在这里插入图片描述
采用广度优先搜索,先测试数据较少:

在这里插入图片描述

//https://www.cnblogs.com/yuanhang110/p/10588575.html
#include<iostream> 
#include<string>
#include<queue>
using namespace std;
string ss[35];//储存地图的字符串 
int maze[35][55];//地图35行,55列 
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};// 向下,向左,向右,向上。 
char letter[4]={'D','L','R','U'} ;//向下,向左,向右,向上 
int cnt =10000;//记录走出迷宫所需要的步数,初值设为10000 
bool vis[35][55];
struct node
{
 int x;
 int y;
 string s;//储存路径字符串 
 int step;//储存到达5步数 
 node (int xx,int yy,string ss,int st)//构造函数  
 {
 	x=xx;
 	y=yy;
 	s=ss;
 	step=st;
 }
};
bool in (int x,int y) //是否越界 
{
	if(x<4&&x>=0&&y<6&&y>=0) //4行,6列  
	{	
		return true;
	 } 
	return false;
}
void bfs(int x,int y,string s,int step)
{
	queue<node> q;//创建队列 q 
	q.push(node(x,y,s,step));//初始坐标入队,赋给当前节点 
	while(!q.empty())//队列为空时,尝试了所有的结果 
    {
      node now =q.front() ;//更新当前节点的值 
      q.pop(); //将头节点出队 
      vis[now.x][now.y]=true;//true 代表已经访问过 
	  if(now.x==3&&now.y==5)//到达出口 
	  {
	  	if(now.step<cnt )
	  	{
	  		cnt =now.step;//记录最短步数  
	  		cout<<now.step<<":"<<now.s<<endl;//输出步数,路径。 
		  }
		  continue;//进行下一次while循环,理论上可以break.这是为了保险探索了所有可能情况 
	   } 
		for (int i=0;i<4;i++) //下左右上四个方向进行探索  
		{
			int tx=now.x+dir[i][0];//x坐标计算  
			int ty=now.y+dir[i][1];//y坐标计算 
			if(maze[tx][ty]!=1&&!vis[tx][ty]&&in(tx,ty))//如果坐标在边界内,有路,未曾访问过 
			{
				
				q.push(node(tx,ty,now.s+letter[i],now.step+1));//将这个坐标入队列 ,记录路径,和步数。   
				
			 } 
		 } 
	}		
 } 
 
 int main()
 {
 	for (int i=0;i<4;i++)
 	{
 		cin>>ss[i];
	 }
 	for(int i=0;i<4;i++)
     {
	   for(int j=0;j<6;j++)
	   {
	     maze[i][j]=(ss[i][j]-'0');
		} 
	 }
	 int step=0;
	 string s=" ";
	 bfs(0,0,s,step);
       return 0;
   } 

在这里插入图片描述

//https://www.cnblogs.com/yuanhang110/p/10588575.html
#include<iostream> 
#include<string>
#include<queue>
using namespace std;
string ss[35];//储存地图的字符串 
int maze[35][55];//地图35行,55列 
int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};// 向下,向左,向右,向上。 
char letter[4]={'D','L','R','U'} ;//向下,向左,向右,向上 
int cnt =10000;//记录走出迷宫所需要的步数,初值设为10000 
bool vis[35][55];
struct node
{
 int x;
 int y;
 string s;//储存路径字符串 
 int step;//储存到达5步数 
 node (int xx,int yy,string ss,int st)//构造函数  
 {
 	x=xx;
 	y=yy;
 	s=ss;
 	step=st;
 }
};
bool in (int x,int y) //是否越界 
{
	if(x<30&&x>=0&&y<50&&y>=0) //30行,50列  
	{	
		return true;
	 } 
	return false;
}
void bfs(int x,int y,string s,int step)
{
	queue<node> q;//创建队列 q 
	q.push(node(x,y,s,step));//初始坐标入队,赋给当前节点 
	while(!q.empty())//队列为空时,尝试了所有的结果 
    {
      node now =q.front() ;//更新当前节点的值 
      q.pop(); //将头节点出队 
      vis[now.x][now.y]=true;//true 代表已经访问过 
	  if(now.x==29&&now.y==49)//到达出口 
	  {
	  	if(now.step<cnt )
	  	{
	  		cnt =now.step;//记录最短步数  
	  		cout<<now.step<<":"<<now.s<<endl;//输出步数,路径。 
		  }
		  continue;//进行下一次while循环,理论上可以break.这是为了保险探索了所有可能情况 
	   } 
		for (int i=0;i<4;i++) //下左右上四个方向进行探索  
		{
			int tx=now.x+dir[i][0];//x坐标计算  
			int ty=now.y+dir[i][1];//y坐标计算 
			if(maze[tx][ty]!=1&&!vis[tx][ty]&&in(tx,ty))//如果坐标在边界内,有路,未曾访问过 
			{
				
				q.push(node(tx,ty,now.s+letter[i],now.step+1));//将这个坐标入队列 ,记录路径,和步数。   
				
			 } 
		 } 
	}		
 } 
 
 int main()
 {
 	for (int i=0;i<30;i++)
 	{
 		cin>>ss[i];   //30行 
	 }
 	for(int i=0;i<30;i++)
     {
	   for(int j=0;j<50;j++)
	   {
	     maze[i][j]=(ss[i][j]-'0');
		} 
	 }
	 int step=0;
	 string s=" ";
	 bfs(0,0,s,step);
       return 0;
   } 

在这里插入图片描述

在这里插入图片描述
完全二叉树 :每一层,子节点是父节点的二倍。不用用数的数据结构也可以求出来。

#include"iostream"
#include"algorithm"
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f;
int main()
{
	int n;//个数  
	cin>>n;
    long long  min=-INF,ans=0;
    int i=0,length=1,depth=1;
    for(i=0;i<n;)
    {
    	long long  sum=0;
    	for (int j=0;j<length&&i<n;j++,i++)//逐行求和 
    	{
    		int x;
    		cin>>x;
    		sum+=x;
		}
		if(sum>min)
		{
			min=sum;
			ans=depth;
		 } 
		 depth++;
		 length*=2;
	}
	cout<<ans<<endl;
 } 

在这里插入图片描述

在这里插入图片描述
用店家标识,代表“店家优先级数组”的下标。
在这里插入图片描述

#include<iostream>
#include"algorithm"//sort需要  
#include"string.h"//memset 需要  
#define maxn 100000          
using namespace std;
int b[maxn]={0};    //b存放每个店的优先级。 
int book[maxn]={0};//标记外卖店是否在优先缓存中。  
int book2[maxn]={0};//判断某个时刻i,外卖店是否有订单,如果有订单则标记1,没有则标记为0 
struct waimai
{
	int ts;  //时刻 
	int id; //店标识 
 }a[maxn];
  
 
bool cmp(waimai a,waimai b)  //sort排序所需要的 cmp,是函数名可以任意起 
{
	return a.ts<b.ts;       //按时刻从到大排序,从大到小改为大于号   
}
int main()
{
	int n,m,t;
	int count=0;
	scanf("%d%d%d",&n,&m,&t);  //输入,店家数,订单数,时刻 
    for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a[i].ts,&a[i].id);
	}
	sort(a+1,a+m+1,cmp);      //所有订单按时刻从小到大排序 
//	for(int i=1;i<=m;i++)
//	{
//		printf("%d %d\n",a[i].ts,a[i].id);
//	} 
    for (int i=1;i<=t;i++)//i是时刻的索引值,这个for循环求时刻i时,各个店家的优先级。 
	{   count = 0; 
		int x;
		for(int j=1;j<=m;j++)//时刻i,有订单的店家更新优先级,并且对其进行标记。 
		{
			if(i==a[j].ts) //是i时刻的订单 
			{
			  x=a[j].id;   //取出是家店x的订单 
			  b[x]+=2;     //这家店x有一个订单,店x的优先级加2       
			  book2[x]=1;  // 标记i时刻店家x有订单 
			}
			
		}
		for(int l=1;l<=n;l++)//对于所有的店家,如果时刻i没有订单,则优先级减1,或者保持零 
		{
			if(book2[l]==0) //店家l没有订单 
			{
			
					if(b[l]>0)
					 b[l]--;//店家l的优先级减去一 
					 else
					 b[l]=0;
				
			 } 
		}
		for(int l=1;l<=n;l++) //计算i时刻优先级大于5的店家数量 
		{
		 if(b[l]>5)//i时刻,店家l优先级大于5 
		 {
			 	book[l]=1;//店家l,标记在优先内存中 
				count++;   
		    }
		  
		} 
	 
		    memset(book2,0,sizeof(book2));//将所有清零为,即认为全部没有订单。 
		                       		
		}
		printf("%d\n",count);
		return 0;
 } 

测试数据1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include"iostream"
using namespace std;
#define N 1000005
int mark[N]={0};//数是否出现,的标记数组。 
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int m;
		cin>>m;
		while(mark[m]==1)//数已经出现  
		   m++;//数加一 
		mark[m]=1;//跳出循环后已经不会重复 
		cout<<m;		
	 } 
	
	return 0;
} 

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值