2021女生赛——5道基础题整理

音乐游戏

题目描述

【遇到的问题】
一眼看去非常简单,但就是过不去。
无论是scanf(),string,getchar(),还是不同位置的缓存清楚,都一直WA,
但又觉得哪都没错(这么简单能错在哪?)

最后抱着试一试的心态,把 ios::sync_with_stdio(false); cin.tie(0); 这两行注释掉了;
然后……
就AC了……(T_T) 一个多小时啊 (╯▔皿▔)╯

传送门:C++中ios::sync_with_stdio(false); 与 getchar() 不能同时使用的原因

AC代码

#include <bits/stdc++.h>
using namespace std;
int main(){
//    ios::sync_with_stdio(false);
//    cin.tie(0);

    int n;  cin>>n;
    int cnt=0;
    char c;
    getchar();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=6;j++){
            c=getchar();
            if(c=='-') cnt++;
        }
        getchar();
    }
    cout<<cnt<<endl;

    return 0;
}

公交线路

题目描述
【遇到的问题】
1、题目没读好,没去想 ≤|x-y| 的含义;导致有了多余的想法(比如:做到总站,又返回(这又涉及到两种情况));
2、没带纸笔,从公司到家的方向总是不明朗;
3、知道可以通过字符串匹配,但是一开始的处理是把主串翻转(默认回家方向向右,若向左,则反转);后来反应过来有更清晰明朗的写法┭┮﹏┭┮

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N=100;

bool Judge(string sub,string temp,string cmp){
    return (temp.find(sub)!=-1 && cmp.find(sub)!=-1);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n,m,x,y;
    int k[N],p[N];
    string temp="";	   //正确主串
    string sub="";	   //子串
    string cmp="";	   //错误主串

	//子串分别匹配两个主串,当且仅当(正确主串匹配正确,且错误主串匹配错误),方向才正确

    cin>>n>>x>>y;
    for(int i=1;i<=n;i++) cin>>k[i];
    if(x<y){    //右方向
        for(int i=x+1;i<=y;i++) temp+=k[i]+'0';
        for(int i=x-1;i>=0;i--) cmp+=k[i]+'0';
    }else{    //左方向
        for(int i=x-1;i>=y;i--) temp+=k[i]+'0';
        for(int i=x+1;i<=n;i++) cmp+=k[i]+'0';
    }
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>p[i];
        sub+=p[i]+'0';
    }

    if(Judge(sub,temp,cmp)){
        cout<<"Unsure"<<endl;
    }else{
        if(temp.find(sub)!=-1) cout<<"Right"<<endl;
        else cout<<"Wrong"<<endl;
    }

    return 0;
}

修建道路

题目描述
【遇到的问题】
没仔细看 max(a[k]), (k∈[i,j])
首先想到的是:1-n中的最大值 + 2-n中的最大值 + … +
当然这个一开始就被PASS了;

最大的问题是,题目对数组 a[ ] 没有解释(我认为);
现在感觉应该指的是,如果两两相邻村庄之间修建道路,那么就需要的花费;(可是 a [ ] 的数据个数是n,不是n-1 (・∀・(・∀・(・∀・*)……)
所以,不要纠结啦,直接当作求每个点连通后满足条件的最小权值和吧(●ˇ∀ˇ●)
啊哈哈哈哈(ˉ▽ˉ;)…

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N=200010;
typedef long long ll;
ll a[N];

/*
主要:最开始没看懂题意,也没好好揣摩max的含义

自己做的话应该会陷入到动态规划里,
因为这句话“ max(i≤k≤j){ak} ”;

图形想得正确,啊,其实自己也能做出来
*/

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;  cin>>n;
    ll ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=2;i<=n;i++){
        ans+=max(a[i],a[i-1]);
    }
    cout<<ans<<endl;

    return 0;
}

3G网络

题目描述
【解决】
一开始是数学推导,但,哦豁 (○´・д・)ノ 又是平方又是和又是交集的,这怎么证明(〃>目<)
其实自己陷入了严谨推导的误区里;
这里完全可以采用无限逼近的思想(题目还给你提示了……)

耍一个小聪明 (●’◡’●) 观察可以发现,答案就是 n 的倒数~ o( ̄▽ ̄)o

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n; cin>>n;
    int x,y;
    for(int i=0;i<n;i++) cin>>x>>y;
    printf("%.10lf\n",(double)1/n);

    return 0;
}

驾驶卡丁车

题目描述
【解决】
1、与 BFS 思想一样,但实现简单 ┭┮﹏┭┮
2、方向的处理:一是可以利用 1-8;二是利用 +7)%8 或 +1)%8;

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=55;
int n,m,q,x,y;
string s;
int mp[N][N];
struct node{
    int x,y;
};
struct node path[8]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

// (+7)%8  向左偏
// (+1)%8  向右偏

int check(int dir){
    if(dir==1 || dir==3 || dir==5 || dir==7){
        if(mp[x+path[(dir+7)%8].x][y+path[(dir+7)%8].y]==1 &&
           mp[x+path[(dir+1)%8].x][y+path[(dir+1)%8].y]==1)
        return 1;
    }
    return 0;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>s;
        for(int j=0;j<m;j++){
            if(s[j]=='.') mp[i][j+1]=0;
            else if(s[j]=='#') mp[i][j+1]=1;
            else{
                mp[i][j+1]=0;
                x=i,y=j+1;
            }
        }
    }
    cin>>q; cin>>s;
    int v=0,dir=0;
    for(int step=0;step<q;step++){
        bool is_ok=true;
        if(s[step]=='L') dir=(dir+7)%8;
        else if(s[step]=='R') dir=(dir+1)%8;
        else if(s[step]=='U') v++;
        else if(s[step]=='D') v=max(v-1,0);

        int xx,yy;
        for(int i=1;i<=v;i++){
            yy=y+path[dir].y;
            xx=x+path[dir].x;
            if(mp[xx][yy] || xx<=0 || yy<=0 || xx>n || yy>m || check(dir)){
                cout<<"Crash! "<<x<<" "<<y<<endl;
                v=0;
                is_ok=false;
                break;
            }
            x=xx,y=yy;
        }
        if(is_ok) cout<<x<<" "<<y<<endl;
    }
    return 0;
}

WA代码(但是找不出bug)

我反正是不想找了(De了一天了 凸(艹皿艹 ) ),要是大家愿意帮我也是不错的嗷 U•ェ•*U

#include <bits/stdc++.h>
using namespace std;
const int N=60;
char map_[N][N];
int n,m,q;
int x,y,v;
int drt=1;


// 1   2   3   4   5   6   7   8
//上 右上 右 右下 下 左下 左 左上


void DirctionJudge(char fx){
    if(fx=='L'){
        drt==1 ? drt=8:--drt;
    }else{
        drt==8 ? drt=1:++drt;
    }
}

void Move(){
    if(drt==1) x-=v;
    else if(drt==2) x-=v,y+=v;
    else if(drt==3) y+=v;
    else if(drt==4) x+=v,y+=v;
    else if(drt==5) x+=v;
    else if(drt==6) x+=v,y-=v;
    else if(drt==7) y-=v;
    else if(drt==8) x-=v,y-=v;
}

bool IsCrash(int tx,int ty){
    if(drt==1){
        if(v)
        for(int i=tx;i>=x;i--){
            if(map_[i][ty]=='#'){
                x=i+1,y=ty;
                v=0;
                return true;
            }
            if(i<1){
                x=1;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==2){
        if(v)
        for(int i=tx,j=ty;i>x && j<y;i--,j++){
            if((map_[i-1][j]=='#' && map_[i][j+1]=='#')||map_[i-1][j+1]=='#'){
                x=i,y=j;
                v=0;
                return true;
            }
            if(i<1 && j>m){
                x=1,j=m;
                v=0;
                return true;
            }else if(i<1){
                x=1,y=j;
                v=0;
                return true;
            }else if(j>m){
                x=i,y=m;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==3){
        if(v)
        for(int i=ty;i<=y;i++){
            if(map_[tx][i]=='#'){
                x=tx,y=i-1;
                v=0;
                return true;
            }
            if(i>m){
                y=m;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==4){
        if(v)
        for(int i=tx,j=ty;i<x && j<y;i++,j++){
            if((map_[i+1][j]=='#' && map_[i][j+1]=='#')||map_[i+1][j+1]=='#'){
                x=i,y=j;
                v=0;
                return true;
            }
            if(i>n && j>m){
                x=n,y=m;
                v=0;
                return true;
            }else if(i>n){
                x=n,y=j;
                v=0;
                return true;
            }else if(j>m){
                x=i,y=m;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==5){
        if(v)
        for(int i=tx;i<=x;i++){
            if(map_[i][ty]=='#'){
                x=i-1,y=ty;
                v=0;
                return true;
            }
            if(i>n){
                x=n;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==6){
        if(v)
        for(int i=tx,j=ty;i<x && j>y;i++,j--){
            if((map_[i+1][j]=='#' && map_[i][j-1]=='#')||map_[i+1][j-1]=='#'){
                x=i,y=j;
                v=0;
                return true;
            }
            if(i>n && j<1){
                x=n,y=1;
                v=0;
                return true;
            }else if(i>n){
                x=n,y=j;
                v=0;
                return true;
            }else if(j<1){
                x=i,y=1;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==7){
        if(v)
        for(int i=ty;i>=y;i--){
            if(map_[tx][i]=='#'){
                x=tx,y=i+1;
                v=0;
                return true;
            }
            if(i<1){
                y=1;
                v=0;
                return true;
            }
        }
        return false;
    }else if(drt==8){
        if(v)
        for(int i=tx,j=ty;i>x && j>y;i--,j--){
            if((map_[i][j-1]=='#' && map_[i-1][j]=='#')||map_[i-1][j-1]=='#'){
                x=i,y=j;
                v=0;
                return true;
            }
            if(i<1 && j<1){
                x=1,y=1;
                v=0;
                return true;
            }else if(i<1){
                x=1,y=j;
                v=0;
                return true;
            }else if(j<1){
                x=i,y=1;
                v=0;
                return true;
            }
        }
        return false;
    }
    return false;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    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]=='*'){
                x=i, y=j;
                map_[i][j]='.';
            }
        }
    cin>>q;
    string op;  cin>>op;

    int idx=0;
    while(q--){
        int tx=x,ty=y;
        if(op[idx]=='L'){
            DirctionJudge('L');
        }else if(op[idx]=='R'){
            DirctionJudge('R');
        }else if(op[idx]=='U'){
            v++;
        }else{
            v=max(v-1,0);
        }
        Move();
        idx++;
//        cout<<"起始点:("<<tx<<","<<ty<<")"<<endl;
//        cout<<"方向="<<drt<<endl;
//        cout<<"移动"<<v<<"格"<<endl;
//        cout<<"现在点:("<<x<<","<<y<<")"<<endl;
        if(IsCrash(tx,ty)){
            cout<<"Crash! "<<x<<" "<<y<<endl;
        }else{
            cout<<x<<" "<<y<<endl;
        }
    }

    return 0;
}

想记录的 (●ˇ∀ˇ●)

(1)审题一定要仔细!一定要纸笔 ┭┮﹏┭┮
(2)C++输入输出流;
(3)BFS;方向表示;
(4)小聪明之找规律;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值