重新振作第二天-----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)
暂无