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();
}

浙公网安备 33010602011771号