重新振作第二天-----2024csp/j普及组题解

第一题:扑克牌 (简单思维)

题意介绍:给出n张牌不同花色的牌,每一张牌由两个字符组成,第一个代表花色,第二个代表的是牌面数字,询问还需要多少张牌才可以凑齐一副完整的扑克。

数据范围:n<=52

思路:因为每一张牌都是独一无二的,那我们只需要用map去重一下即可,然后用52减去去重后的数量即可。

复杂度:O(n)

代码实现:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	map<string,int>mp;
	string s;
	for(int i=1;i<=n;i++){
		cin>>s;
		mp[s]++;
	}
	int ans=52;
	ans-=mp.size();
	cout<<ans<<endl;
}

第二题:地图探险 (简单模拟)

题意介绍:给出T组数据,首先给出n,m,k,分别表示地图的行列,以及机器人可以移动的次数,然后给出x,y,d分别表示机器人最开始的坐标和朝向。接着,给出n行字符,每行有m个,代表着地图中的情况,如果是“.”,则代表可以走,若是“x”,则代表不能走。根据不同的朝向,机器人采取不同的行走,d=0,则y+1;d=1,则x+1;d=2,则y-1;d=3,则x+1。在这期间,如果机器人超过了地图的范围的话,或者无法行走的话,则向右转,d=(d+1)%4,则要求找出机器人所经过的格子数目。

数据范围:n<=1E3,m<=1E3,k<=1E6

思路:直接跟着题目说的,模拟一下,也没有用到什么优化之类的。

复杂度:O(max(k,n*m))

代码实现:

#include<bits/stdc++.h>
using namespace std;
char a[2000][2000];
int vis[2000][2000];
void solve(){
	int n,m,k;
	cin>>n>>m>>k;
	int x,y,d;
	cin>>x>>y>>d;
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	vis[x][y]=1;
	for(int i=1;i<=k;i++){
		if(d==0){
			if(y+1>m||a[x][y+1]=='x'){
				d=(d+1)%4;
			}
			else {
				y+=1;
			}
		}
		else if(d==1){
			if(x+1>n||a[x+1][y]=='x'){
				d=(d+1)%4;
			}
			else {
				x+=1;
			}			
		}
		else if(d==2){
			if(y-1<1||a[x][y-1]=='x'){
				d=(d+1)%4;
			}
			else {
				y-=1;
			}
		}
		else if(d==3){
			if(x-1<1||a[x-1][y]=='x'){
				d=(d+1)%4;
			}
			else {
				x-=1;
			}			
		}
		vis[x][y]=1;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(vis[i][j])
			ans++;
		}
	}
	cout<<ans<<endl;	
}
int main(){
	int t;
	cin>>t;
	while(t--)
	solve();
}

第三题:小木棍 (思维)

题意介绍:给出n根木棍,要求木棍全部用完的情况下,输出所组成的不包含前置0的最小正数是多少。如果无法不存在,则输出-1。

数据范围:n<=1E5

思路:首先,根据性价比而言,优先考虑的是数字的位数,数字位数越少,值越小。因为8所消耗的木棍是最多的,所以我们肯定能组成的8越多越好。在这个大前提下,我们看能否拆掉前面的8,使得在位数不变的情况下,使得数字最小。而要求数字最小的时候,其实我们最多只能拆2个8。因为我们考虑比8小的数字所拆的木棍,有2,5,4,6,7这五种可能,如果我们拆了更多的8,则会多出更多的木棍,但是我们不能形成更多的位数,因此可以先缩小拆的8在5及以内。因为只有除以8之后剩下的木棍大于0,我们才会有拆的情况,而加上木棍数后的数量又不能超过6,则只能是5,但是我们要求所组成的数字最小,则小数字所节省的木棍肯定后续得使用。由此,当我们计算到20个的时候,就可以得到,后面即使再进行拆分,也无法使得第一个数字比前面的小。因此只需要前20个打表,后续直接加上若干个8即可。

复杂度:O(n)

代码实现:

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n;
	cin>>n;
	int ans[23]={-1,-1,1,7,4,2,6,8,10,18,22,20,28,68,88,108,188,200,208,288,688};
	int x=n/7;
	int y=n%7;
	// 1:2
	// 2:5  3:5  5:5
	// 4:4
	// 0:6  6:6  9:6
	// 7:3
	// 8:7
	if(x>1){
		x-=2;
		y+=14;
		cout<<ans[y];
		while(x--){
			cout<<8;
		}
		cout<<endl;
	}
	else {
		y+=x*7;
		cout<<ans[y]<<endl;
	}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

第四题:接龙 (DP)

暂无

posted @   菜dog的日常生活  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示