Logo 陈明玮的博客

博客

省赛冲刺班模拟考试 题解

2024-05-31 21:48:39 By 陈明玮

A.取石子

将数据特判一下,递归求解。

#include<iostream>
using namespace std;
int a,b;
bool f;
void s() {
    f=!f;
    if(a==b||a/b>=2||b/a>=2) {
        return;
    }
    a>b?a-=b:b-=a;
    s();
}
int main() {
    while(cin>>a>>b) {
        if(a==0&&b==0) {
            break;
        }
        if(a==0||b==0) {
            cout<<"win"<<endl;
            continue;
        }
        f=false;
        s();
        if(f) {
            cout<<"win"<<endl;
        } else {
            cout<<"lose"<<endl;
        }
    }
    return 0;
}

B.骑行

套用数学公式,并且出发时间为负数的不管他,反正追不上。找最快的。

#include <iostream>
using namespace std;
int n,ans,v,t;
int main() {
    while(cin>>n) {
        if(n==0) {
            break;
        }
        ans=0xfffffff;
        for(int i=1 ; i<=n; i++) {
            cin>>v>>t;
            if(t<0) {
                continue;
            }
            int f=(16200.0/(double)v)+t+0.99;
            ans=min(f,ans);
        }
        cout<<ans<<endl;
    }
    return 0;
}

C.拯救行动

经典的宽搜,加一个杀掉守卫的if就行了。

#include <iostream>
#include <cstring>
using namespace std;
int n,m,ax,ay,bx,by,f,minn,v[210][210],q[40100][3],dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1},t;
char map[210][210];
void bfs(int x,int y,int l) {
    int head=0,tail=1;
    q[tail][0]=x;
    q[tail][1]=y;
    q[tail][2]=l;
    v[x][y]=1;
    while(head!=tail) {
        head++;
        x=q[head][0];
        y=q[head][1];
        l=q[head][2];
        v[x][y]=1;
        if(x==bx&&y==by) {
            minn=l;
            break;
        }
        if(map[x][y]=='x') {
            tail++;
            map[x][y]='@';
            q[tail][0]=x;
            q[tail][1]=y;
            q[tail][2]=l+1;
        } else {
            for(int i=0; i<4; i++) {
                int nx=x+dx[i];
                int ny=y+dy[i];
                if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&map[nx][ny]!='#'&&v[nx][ny]==0) {
                    tail++;
                    q[tail][0]=nx;
                    q[tail][1]=ny;
                    q[tail][2]=l+1;
                    v[nx][ny]=1;
                }
            }
        }
    }
}
int main() {
    cin>>t;
    while(t--) {
        minn=0;
        memset(map,'#',sizeof(map));
        memset(v,0,sizeof(v));
        cin>>n>>m;
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=m; j++) {
                cin>>map[i][j];
                if(map[i][j]=='r') {
                    ax=i;
                    ay=j;
                }
                if(map[i][j]=='a') {
                    bx=i;
                    by=j;
                }
            }
        }
        bfs(ax,ay,0);
        if(minn) {
            cout<<minn<<endl;
        } else {
            cout<<"Impossible"<<endl;
        }
    }
    return 0;
}

D.阶梯电价

直接枚举u、v之间的数,几个if判断就行了。

#include <iostream>
using namespace std;
int u,v;
double ans;
int main() {
    cin>>u>>v;
    for(int i=u+1; i<=v; i++) {
        if(i<=2760) {
            ans+=0.52;
        } else if(i>2760&&i<=4800) {
            ans+=0.57;
        } else if(i>4800) {
            ans+=0.82;
        }
    } 
    printf("%.2f",ans);
    return 0;
}

这是本蒟蒻第一次写题解,望大家支持!如果大佬们有宝贵意见,请在评论区留言。

评论

陈明玮
@zuotingting
陈明玮
@zuotingting
李凌宇
eee

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。