蓝桥杯31天冲刺打卡(Day11)

Hallo,大家好!不知不觉就过了11天了,让我们共同努力吧!

目录

A 天干地支

解析:

代码:

B 包子凑数

解析:

代码:

C 求值

解析:

代码:

D 青蛙跳杯子

解析:

代码:





A 天干地支

解析:

        这是一道模拟题,我们已知2020年输出是“gengzi”,而2020%10==0,geng的位置需要在此加6再去取余,所以输出要(n+6)%10,同理地支也是如此。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string a[]= {"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
string b[]= {"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};

int main() {
	int n;
	cin>>n;
	cout<<a[(n+6)%10]<<b[(n+8)%12];
	return 0;
}

B 包子凑数

解析:

        一道完全背包问题,具体解析放到代码了。这个代码很奇怪,试了2k组数据都是对的,而在我的评测机下只能拿87.5,但是在Pluto的评测机是正确的,我不能理解,我非常不能理解!

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
//100*100是10000,所以开到10000就够了,下面判定也是
int a[105],b[10005];//a存数,b标记

int main() {
	int n;
	bool flag=false;//用于标记是否会输出INF
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>a[i];
		b[a[i]]=1; //标记该数可以表示
	}
	//类似完全背包(从小到大枚举)
	for(int i=0; i<n; i++)
		for(int j=1; j<=10000; j++)
			if(b[j]) b[j+a[i]]=1; //DP,如果该数能表示,那么往后加已有的包子数目依旧能表示

	int cnt=0;//计算能 连续 表示多少个
	for(int i=1; i<=10000; i++) {
		if(b[i]) cnt++;
		else cnt=0;//断开要重置
		if(cnt==a[0]) flag=true;//有限个不能表示
	}

	int sum=0;//计算有几个不能被表示的包子数目
	if(!flag) cout<<"INF"; //无限个不能表示
	else {
		for(int i=1; i<=10000; i++)
			if(!b[i]) sum++;
		cout<<sum;
	}
	return 0;
}

C 求值

解析:

        简单模拟题,直接暴搜,从1开始也行,只是会T,不过是填空题,答案对了就行。由于答案是45360,所以我直接从45350开始了,嘻嘻嘻!

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;

int main() {
	for(int i=45350; ; i++) {
		int s=0;
		for(int j=1; j<=i; j++)
		if(i%j==0) s++;
		if(s==100) {
			cout<<i;
			return 0;
		}
	} 
	return 0;
}

D 青蛙跳杯子

解析:

        这是一道简单的BFS题(队列),题目的意思是这个*可以往前走1、2、3步或往后走1、2、3步,还有这个题目的W和B没什么用,混淆视听吧。然后走到的位置和当前的青蛙换位,也就是swap。输入是两个字符串,初始和目标,我们用两个string存储。题目问的是至少,我们可以理解为最少要几步到目标状态(说个题外话,迷宫里是非空队列出队头元素,用for遍历四个方向,然后检测周围是否符合题意,如符合标记该点并用新变量或者交换元素入队,随后继续重复操作),而这个题不是遍历4个方向(1维),而是遍历6种情况,我们也可以像上面那样进行入队,不过我们要标记当前状态,可是这次不能标记点,而是标记整个字符串,所以我们可以用哈希、map、set等方法来标记,也可以在结构体中定义一个判断变量来实现。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string st,s;
const int dr[6]= {-3,-2,-1,1,2,3};//6种情况 
int n;
map<string, int> mapp;//map中string映射到int,标记并存储步数 
queue<string> q;

//bfs模板
int bfs() {
	q.push(st);
	mapp[st]=0;//起点
	while(!q.empty()) {
		int x;
		string ss=q.front();
		q.pop();
		int d=mapp[ss];//存储用的步数 
		
		//找到空杯子的位置,也可以用x=ss.find('*')
		for(int i=0; i<n; i++)
		if(ss[i]=='*') {
			x=i;
			break;
		}
		
		for(int i=0; i<6; i++) {
			int z=x+dr[i];
			if(z<0 || z>=n) continue;//边界
			
			string aa;
			aa=ss; 
			aa[x]=ss[z];
			aa[z]=ss[x];//交换,也可以直接用swap
			//swap(ss[x],ss[z]);
			
			//未标记过 
			if(!mapp.count(aa)) {
				mapp[aa]=d+1;//步数+1
				if(aa==s) return mapp[aa];
				q.push(aa);
			}

			//swap(ss[x],ss[z]);
		}
	}
}

int main() {
	cin>>st>>s;
	n=st.size();
	cout<<bfs();
	return 0;
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_谦言万语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值