【LGR-251-Div.4】洛谷入门赛 #40

· · 题解

前情提要,因为被-S的二分吓哭了于是找点题练练手感

T1 小学奥数 答案为 (n-1)*(m-1)-1

#include<cstdio>
using namespace std;
namespace Main{
    int n,m;
    inline void main(){
        scanf("%d%d",&n,&m);
        printf("%d",(n-1)*(m-1)-1);
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T2 sort一遍懒得写if,注意如果没有复合的就输出排序后第二个元素在原来数组中的下标

#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
    int k,res=-1;
    int s[3],w[3];
    inline void main(){
        scanf("%d%d%d%d",&s[0],&s[1],&s[2],&k);
        w[s[0]]=0,w[s[1]]=1,w[s[2]]=2;
        for(int i=0;i<=2;i++){
            res=s[i]==k?i:res;
        }
        sort(s,s+3);
        for(int i=1;i<=2;i++){
            if(s[i]==s[i-1]){
                printf("Report");
                return ;
            }
        }
        if(!(~res)){
            res=w[s[1]];
        }
        printf("%c",(char)('A'+res));
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T3 按位拆分数字,判断删除末尾的0后有几位数字即可

#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
    int n;
    inline void main(){
        scanf("%d",&n);
        if(n>=1&&n<=10){
            printf("Yes");
        }
        else{
            int cnt=0;
            while(n){
                cnt+=(bool)(n%10);
                n/=10;
            }
            printf(cnt==1?"Yes":"No");
        }
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T4 set统计,s[i]表示i出现过的所有下表,s[i].size代表i的出现次数,无解Error,有解答案即为s[m][k-1]

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
namespace Main{
    const int N=5050;
    int n,k,m;
    vector<int> s[N];
    inline void main(){
        scanf("%d",&n);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);
            s[x].push_back(i);
        }
        scanf("%d%d",&k,&m);
        if(s[m].size()<k){
            printf("Error");
            return ;
        }
        printf("%d",s[m][k-1]);
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T5 不使用数组的情况下对于任意i判断奇偶性,注意i要从2开始并且要存储上一个输入的数

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
namespace Main{
    int T,n;
    inline void main(){
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            int lst;
            bool flag=0;
            scanf("%d",&lst);
            for(int i=2,x;i<=n;i++){
                scanf("%d",&x);
                if(i&1){
                    flag=max(flag,lst==x);
                }
                else{
                    flag=max(flag,lst!=x);
                }
                lst=x;
            }
            puts(flag?"No":"Yes");
        }
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T6 模拟,注意取模的时候要写成(x+p)%p 防止出现负数

#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
    const int N=3010;
    int n,q;
    int s[N];
    set<int> st;
    inline void main(){
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++){
            scanf("%d",&s[i]);
        }
        while(q--){
            int p;
            scanf("%d",&p);
            for(int i=1;i<=n;i++){
                st.insert((s[i]+p)%p);
            }
            printf("%d\n",st.size());
            st.clear();
        }
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T6 先找出那个整数,接着从右向左模拟,遇到'[',']'均跳过,a数组就cnt=a[cnt],b数组就cnt=b[cnt],注意下标处理即可

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Main{
    const int N=1e5+7;
    int n,cnt;
    char s[N];
    int a[N],b[N];
    inline void main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&b[i]);
        }
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=1;i<=len;i++){
            if(s[i]>='0'&&s[i]<='9'){
                while(s[i]>='0'&&s[i]<='9'){
                    cnt=(cnt<<1)+(cnt<<3)+(s[i]^48);
                    ++i;
                }
                break;
            }
        }
        for(int i=len;i;--i){
            while(s[i]==']'||s[i]=='['){
                --i;
            }
            if(s[i]=='a'){
                cnt=a[cnt];
            }
            else if(s[i]=='b'){
                cnt=b[cnt];
            }
        }
        printf("%d",cnt);
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}

T7 从上往下模拟,用vector存储箱子的字符,遇到障碍就从障碍上方向上枚举,放置,注意最后如果还有箱子没放要从最底下往上放

使用vector而不是stack的原因是vector有clear函数stack没有,下标处理麻烦点但是写着舒服

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Main{
    const int N=1e5+7;
    int n,m;
    char s[20][N];
    vector<char> q;
    inline void main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%s",s[i]+1);
        }
        for(int i=1;i<=n;i++){
            puts(s[i]+1);
        }
        for(int j=1;j<=m;j++){
            for(int i=1;i<=n;i++){
                if(s[i][j]>='A'&&s[i][j]<='Z'){
                    q.push_back(s[i][j]);
                    s[i][j]='.';
                }
                else if(s[i][j]=='-'){
                    for(int k=i-1;k<=i-q.size();k--){
                        s[k][j]=q[q.size()+k-i];
                    }
                    q.clear();
                }
            }
            if(!q.empty()){
                for(int k=n;k<=n-q.size()+1;k--){
                    s[k][j]=q[q.size()+k-n-1];
                }
                q.clear();
            }
        }
        for(int i=1;i<=n;i++){
            puts(s[i]+1);
        }
        return ;
    }
}
signed main(){
    Main::main();
    return 0;
}