015.洛谷模拟题

做了几道模拟题,总结一下

  • 动手之前一定要好好读题,遗漏信息大概率WA到死
  • 不要怕麻烦,码量大是模拟题的特点
  • 对算法要求一般不高
  • 细心,逻辑链要完整

luogu P1563

处理环形数组

#include<bits/stdc++.h>
using namespace std;
namespace IO{template<typename T>void read(T&x){x=0;bool f=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}if(f)x=-x;}void read(char&c){c=getchar();while(isspace(c))c=getchar();}void read(string&s){s.clear();char ch=getchar();while(isspace(ch))ch=getchar();while(!isspace(ch)&&ch!=EOF){s+=ch;ch=getchar();}}template<typename T,typename...Args>void read(T&first,Args&...rest){read(first);read(rest...);}template<typename T>void wr(T x){if(x==0){putchar('0');return;}if(x<0){putchar('-');x=-x;}char stk[20];int top=0;while(x){stk[++top]=x%10+'0';x/=10;}while(top){putchar(stk[top--]);}}void wr(const char c){putchar(c);}void wr(const string&s){for(char c:s)putchar(c);}void wr(const char*s){while(*s)putchar(*s++);}template<typename T>void wr(const T&x,char sep){wr(x);putchar(sep);}template<typename T,typename...Args>void wr(const T&first,const Args&...rest){wr(first);((putchar(' '),wr(rest)),...);}}using namespace IO;
typedef long long ll;
typedef pair<int,int> pii;

void solve(){
    int n,m;
    read(n,m);
    string s;
    vector<int>a(n);
    vector<string>b(n);
    for(int i=0;i<n;++i)read(a[i],b[i]);
    int x,y,cur=0;
    while(m--){
        read(x,y);y%=n;
        if(a[cur]==x)cur=(cur-y+n)%n;
        else cur=(cur+y+n)%n;
    }
    wr(b[cur]);
}
int main(){
    int T=1;
    //read(T);
    while(T--){
        solve();
    }
}

luogu P1328

简单记数

void solve(){
    int n,na,nb;
    read(n,na,nb);
    vector<int>a(na),b(nb);
    for(int i=0;i<na;++i)read(a[i]);
    for(int i=0;i<nb;++i)read(b[i]);
    int A=0,B=0;
    int i=0,j=0;
    while(n--){
        if(a[i]==0){
            if(b[j]==2||b[j]==3)A++;
            if(b[j]==1||b[j]==4)B++;
        }
        if(a[i]==1){
            if(b[j]==0||b[j]==3)A++;
            if(b[j]==2||b[j]==4)B++;
        }
        if(a[i]==2){
            if(b[j]==4||b[j]==1)A++;
            if(b[j]==0||b[j]==3)B++;
        }
        if(a[i]==3){
            if(b[j]==2||b[j]==4)A++;
            if(b[j]==0||b[j]==1)B++;
        }
        if(a[i]==4){
            if(b[j]==0||b[j]==1)A++;
            if(b[j]==3||b[j]==2)B++;
        }
        i=(i+1)%na;
        j=(j+1)%nb;
    }
    wr(A,B);

}

luogu P1067

处理

  • 全为0
  • 1,-1
  • 首位,末位
void solve(){
    int n;read(n);
    if(n==0){
        int x;
        read(x);
        wr(x);
        return ;
    }
    vector<int>a(n+1);
    bool f=0;
    for(int i=0;i<=n;++i){
        read(a[i]);
        if(a[i])f=1;
    }
    if(f==0||n==0){
        wr(0);
        return ;
    }
    if(a[0]==-1)wr("-x^"),wr(n);
    else if(a[0]==1)wr("x^"),wr(n);
    else if(a[0]>1)wr(a[0]),wr("x^"),wr(n);
    else if(a[0]<-1)wr(a[0]),wr("x^"),wr(n);
    for(int i=1;i<n-1;i++){
        if(a[i]==-1)wr("-x^"),wr(n-i);
        else if(a[i]==1)wr("+x^"),wr(n-i);
        else if(a[i]>1)wr('+'),wr(a[i]),wr("x^"),wr(n-i);
        else if(a[i]<-1)wr(a[i]),wr("x^"),wr(n-i);
    }
    if(a[n-1]==-1)wr("-x");
    else if(a[n-1]==1)wr("+x");
    else if(a[n-1]>1)wr('+'),wr(a[n-1]),wr("x");
    else if(a[n-1]<-1)wr(a[n-1]),wr("x");

    if(a[n]>0)wr('+'),wr(a[n]);
    if(a[n]<0)wr(a[n]);
}

luogu P4924

矩阵翻转

void solve(){
    int n,m;
    read(n,m);
    int t=1;
    vector<vector<int>>M(n+1,vector<int>(n+1));
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            M[i][j]=t++;
        }
    }
    int x,y,r,z;
    while(m--){
        read(x,y,r,z);
        if(z){
            for(int k=x-r;k<=x+r;k++){
            int i=y-r,j=y+r;
            while(i<j){
                swap(M[k][i],M[k][j]);
                i++,j--;
            }
        }
            for(int i=x-r;i<=x+r;++i){
                for(int j=y-r;j<=y+r;j++){
                    if(i-x<j-y)swap(M[i][j],M[x+j-y][y+i-x]);
                }
            }
        }
        else{
           for(int i=x-r;i<=x+r;++i){
                for(int j=y-r;j<=y+r;j++){
                    if(i-x<j-y)swap(M[i][j],M[x+j-y][y+i-x]);
                }
            }
            for(int k=x-r;k<=x+r;k++){
            int i=y-r,j=y+r;
            while(i<j){
                swap(M[k][i],M[k][j]);
                i++,j--;
            }
        }
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
        wr(M[i][j],' ');
        }
        wr('\n');
    }
}

luogu P1098

没考虑数字和字母搭配,还有数字不需要转大写

void solve(){
    int p1,p2,p3;
    read(p1,p2,p3);
    string s;
    read(s);
    int ls=s.length();
    string ans="";
    for(int i=0;i<ls;i++){
        if(s[i]!='-'||i==0||i==ls-1){
            ans+=s[i];
            continue;
        }
        char l=s[i-1],r=s[i+1];
        
        if(((isdigit(l)&&isdigit(r))||(islower(r)&&islower(l)))&&r>l){
            if(r==l+1)continue;
            string t="";
            if(p1==1){
                for(char j=l+1;j<r;j++)
                    for(int k=0;k<p2;k++)t+=j;
            }
            else if(p1==2){
                for(char j=l+1;j<r;j++){
                    char ch=j;
                    if(islower(j))ch=j-'a'+'A';
                    for(int k=0;k<p2;k++){
                        t+=ch;
                    }
                }
            }
            else{
                int cnt=p2*(r-l-1);
                for(int k=0;k<cnt;k++)t+='*';
            }
            if(p3==2)reverse(t.begin(),t.end());
            ans+=t;
        }
        else ans+='-';   
    }
    wr(ans);
}

luogu P1786

哈希,排序技巧

void solve(){
    int n;read(n);
    st A;
    vector<st>ALL,FBZ,a;
    for(int i=0;i<n;i++){
        read(A.name,A.duty,A.w,A.age);A.id=i;
        if(A.duty=="BangZhu")ALL.push_back(A);
        else if(A.duty=="FuBangZhu")FBZ.push_back(A);
        else a.push_back(A);
    }
    for(int i=0;i<(int)a.size();i++){
        for(int j=i;j>0;--j){
            if(a[j-1].w<a[j].w)swap(a[j],a[j-1]);
            else break;
        }
    }
    for(int i=0;i<(int)a.size();++i){
        if(i<2)a[i].duty="HuFa";
        else if(i<6)a[i].duty="ZhangLao";
        else if(i<13)a[i].duty="TangZhu";
        else if(i<38)a[i].duty="JingYing";
        else a[i].duty="BangZhong";
    }
    for(int i=0;i<(int)FBZ.size();++i){
        for(int j=i;j>0;--j){
            if(FBZ[j-1].age<FBZ[j].age)swap(FBZ[j],FBZ[j-1]);
            else break;
        }
    }
    for(auto x:FBZ)ALL.push_back(x);
    for(auto x:a)ALL.push_back(x);
    unordered_map<string,int>rank={
        {"BangZhu", 7}, {"FuBangZhu", 6}, {"HuFa", 5},
        {"ZhangLao", 4}, {"TangZhu", 3}, {"JingYing", 2}, {"BangZhong", 1}
    };
    sort(ALL.begin(),ALL.end(),[&](st a,st b){
        if(rank[a.duty]!=rank[b.duty])return rank[a.duty]>rank[b.duty];
        if(a.age!=b.age)return a.age>b.age;
        return a.id<b.id;
    });
    for(auto x:ALL)wr(x.name,x.duty,x.age,'\n');
}

luogu P1518

  • 哈希判断死循环
  • 扩图,简化判断
vector<vector<char>>M(12,vector<char>(12,'*'));

struct p{
int x,y,d;
}f,c;
void move(p& cur){
    int x=cur.x,y=cur.y;
    if(cur.d==0){
        if(M[x-1][y]=='*')cur.d=1;
        else cur.x--;
    }
    else if(cur.d==1){
        if(M[x][y+1]=='*')cur.d=2;
        else cur.y++;
    }
    else if(cur.d==2){
        if(M[x+1][y]=='*')cur.d=3;
        else cur.x++;
    }
    else{
        if(M[x][y-1]=='*')cur.d=0;
        else cur.y--;
    }
}
int h(p f,p c){
    return f.x+f.y*10+f.d*10000+c.x*100+c.y*1000+c.d*40000;
}
bool nomeet(p f,p c){
    if(f.x==c.x&&f.y==c.y)return 0;
    return 1;
}
void solve(){
    for(int i=1;i<=10;i++){
        for(int j=1;j<=10;j++){
            read(M[i][j]);
            if(M[i][j]=='F')f.x=i,f.y=j;
            if(M[i][j]=='C')c.x=i,c.y=j;
        }
    }
    f.d=0;
    c.d=0;
    int t=0;
    bitset<2000000>vis;
    while(nomeet(f,c)){
        t++;
        if(vis[h(f,c)]){
            wr(0);
            return;
        }
        vis[h(f,c)]=1;
        move(f);
        move(c);
    }
    wr(t);
}

luogu P1065

题目好长,需要一点耐心

void solve(){
    int m,n;
    read(m,n);
    vector<int>o(m*n);
    for(int i=0;i<n*m;++i)read(o[i]);
    vector<vector<int>>nm(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    read(nm[i][j]);
    vector<vector<int>>nt(n+1,vector<int>(m+1));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;++j)
    read(nt[i][j]);
    vector<bitset<100000000>>mt(m+1);
    vector<int>nstep(n+1,1);
    vector<int>npre(n+1);
    int ans=0;
    for(int x:o){
        int step=nstep[x]++;
        int mar=nm[x][step];
        int cost=nt[x][step];

        int i=npre[x];
        while(1){
            while(mt[mar][i])i++;
            bool ok=1;
            for(int j=0;j<cost;++j){
                if(mt[mar][i+j]){
                    ok=0;
                    i+=j+1;
                    break;
                }
            }
            if(ok){
                for(int j=0;j<cost;j++){
                    mt[mar][i+j]=1;
                }
                npre[x]=i+cost;
                ans=max(ans,npre[x]);
                break;
            }   
        }
    }
    wr(ans);
}
posted @ 2025-12-19 21:16  射杀百头  阅读(0)  评论(0)    收藏  举报