AtCoder Beginner Contest 443题解

D - Pawn Line

把他抽象成一个数学问题就行了。

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll t;
  cin >> t;
  while(t--){
    ll n,s=0;
    cin >> n;
    vector<ll> r(n);
    for(auto &nx : r){
      cin >> nx;
      s+=nx;
    }
    for(ll i=1;i<n;i++){ r[i]=min(r[i],r[i-1]+1); }
    for(ll i=n-2;i>=0;i--){ r[i]=min(r[i],r[i+1]+1); }
    for(auto &nx : r){ s-=nx; }
    cout << s << "\n";
  }
  return 0;
}

E - Climbing Silver

就是直接模拟。

int n,m,c;
string a[N];
bool vis[5050][5050];
int ans[N],sam[5050][5050];
void solve(){
    cin>>n>>c;
    up(i,1,n){
        cin>>a[i];
        a[i]=' '+a[i];
    }
    m=a[1].size()-1;
    up(i,1,m){
        sam[n][i]=(a[n][i]=='#');
        
    }
    
    vis[n][c]=1;
    for(int i=n-1;i>=1;i--){
        up(j,1,m){
            if(a[i][j]=='.'){
                if(vis[i+1][j-1]||vis[i+1][j]||vis[i+1][j+1]){
                    
                    vis[i][j]=1;
                }
                sam[i][j]=sam[i+1][j];
            }
            if(a[i][j]=='#'){
                if((vis[i+1][j-1]||vis[i+1][j]||vis[i+1][j+1])&&sam[i+1][j]==0){
                    vis[i][j]=1;
                    sam[i][j]=sam[i+1][j];
                } 
                else sam[i][j]=sam[i+1][j]+1;
            }
        }
    }
    up(i,1,m)cout<<vis[1][i];
    cout<<endl;
}

F - Non-Increasing Number

就是一个bfs加上一些优化罢了。

void print(int x,int y){
    //cout<<"fhdjsk"<<endl;
    vector<int>ans;
    for(int u=x,v=y;v!=-1;){
        ans.push_back(v);
        pii z=pre[u][v];
        u=z.fi;v=z.se;
    }
    ///cout<<"fhdjsk"<<endl;
    reverse(ans.begin(),ans.end());
    for(auto x:ans)cout<<x;
}
void bfs(){
    up(i,1,9){
        if(i%n==0){
            cout<<i;
            return;
        }
        q.push({i,i});
        vis[i%n][i%n]=1;
        pre[i][i]={0,-1};
    }
    while(q.size()){
        pii u=q.front();q.pop();
        up(j,u.se,9){
            int v=(u.fi*10+j)%n;
            if(!vis[v][j]){
                vis[v][j]=1;
                pre[v][j]=u;
                q.push({v,j});
            }
            if(vis[0][j]){
                print(0,j);
                return;
            }
        }
    }
    cout<<-1;
}
void solve(){
    cin>>n;
    bfs();
}
posted @ 2026-03-14 23:08  LiQXing  阅读(1)  评论(0)    收藏  举报