AtCoder Beginner Contest 405 A - E

A - Is it rated?

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;

void solve(){
    int a,b;
    cin>>a>>b;
    
    if(b==1){
        if(a>=1600 && a<=2999){
            cout<<"Yes";
        }else{
            cout<<"No";
        }
    }else{
        if(a>=1200 && a<=2399){
            cout<<"Yes";
        }else{
            cout<<"No";
        }
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int ct=1;
    // cin>>ct;

    while(ct--){
        solve();
    }
    return 0;
}

B - Not All

记录下每个数出现的个数,从后往前删数,删一个数就给这个数的个数--,直到一个在1 - m中的数出现个数被减到0

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;

void solve(){
    int n,m;
    cin>>n>>m;

    vector<int> a(n+1);
    map<int,int>mp;

    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
    }

    int cnt=0;

    for(int i=1;i<=m;i++){
        if(mp[i]) cnt++;
    }

    if(cnt<m){
        cout<<0;
        return;
    }

    for(int i=n;i>=1;i--){
        if(a[i]>=1 && a[i]<=m){
            if(mp[a[i]]>0){
                mp[a[i]]--;
                if(mp[a[i]]==0){
                    cout<<n-i+1;
                    return;
                }
            }
        }
        
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int ct=1;
    // cin>>ct;

    while(ct--){
        solve();
    }
    return 0;
}

C - Sum of Product

前缀和即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;

void solve(){
    int n,ans=0;

    cin>>n;

    vector<int> a(n+1),pre(n+10);

    for(int i=1;i<=n;i++){
        cin>>a[i];
        pre[i]=a[i]+pre[i-1];
    }

    for(int i=2;i<=n;i++){
        ans+=a[i]*pre[i-1];
    }
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int ct=1;
    // cin>>ct;

    while(ct--){
        solve();
    }
    return 0;
}

D - Escape Route

多源BFS,初始时把所有E放进队列里,做BFS。过程中维护每一步走的方向。

注意这里是从终点开始走,所以每一步的方向是从重点到起点,输出时需要反过来。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf=1e18;
const int mod =1e9+7;

void solve(){
    int n,m;
    cin>>n>>m;

    char g[n+10][m+10];
    int dir[n+10][m+10];

    queue<pii> q;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dir[i][j]=-1;
            cin>>g[i][j];
            if(g[i][j]=='E'){
                q.push({i,j});
                dir[i][j]=5;
            }
            if(g[i][j]=='#'){
                dir[i][j]=4;
            }
            // if(i==1 && j==20) cout<<dir[i][j]<<endl;
        }
    }

    int dx[]={1,0,-1,0};
    int dy[]={0,-1,0,1};//下,左,上,右

    while(q.size()){
        auto [a,b]=q.front();
        q.pop();


        // if(a==1 && b==16) cout<<"--"<<endl;

        for(int i=0;i<4;i++){
            int x=a+dx[i];
            int y=b+dy[i];

            // if(x==1 && y==16) cout<<"--"<<endl;

            if(x<1 || x>n || y<1 || y>m) continue;
            if(g[x][y]=='#' || g[x][y]=='E') continue;
            if(dir[x][y]!=-1) continue;

            dir[x][y]=i;
            q.push({x,y});
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int val=dir[i][j];

            if(val==5){
                cout<<'E';
            }
            else if(val==4){
                cout<<'#';
            }
            else if(val==0){
                cout<<'^';
            }
            else if(val==1){
                cout<<'>';
            }
            else if(val==2){
                cout<<'v';
            }
            else if(val==3){
                cout<<'<';
            }
        }
        cout<<endl;
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int ct=1;
    // cin>>ct;

    while(ct--){
        solve();
    }
    return 0;
}

E - Fruit Lineup

最组合数学的一集

首先要确定ABCD之间的关系:

在C之前要放完所有A,在D之前要放完所有A和B

先不考虑BD,只考虑AC,显然只有一种情况,就是 AAACCCC这样,在考虑如何把BD插进去。

首先对B来说,肯定是随便放, 可以放到任意两个数之间或者整个数组两边,共cnt = A+C+1 个空位

对于D, 当确定最后一个B的位置之后, 这个位置之后的所有空位, 都可以放D。 但最后一个B在最后一个A之前时, 则D可以放的位置变成最后一个A之后的空位数。

所以我们要枚举B的最后一个位置, 而最后一个B的位置共有cnt个可能,此时剩下B - 1个B。

如何计算?对于每个空位,这里用到组合数学的插板法,但是每个空位可以放0个或多个。

https://oi-wiki.org/math/combinatorics/combination/

代码实现很标准,可以看代码写法

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll=long long;
const ll inf = 1e18;
const int mod = 998244353;

const int N=3e6+10;
int fact[N];
int infact[N];

int qmi(int a,int b,int p){
    int res=1;
    while(b){
        if(b&1) res=res*a%p;
        b>>=1;
        a=a*a%p;
    }
    return res;
}

void init(){
    fact[1]=1;

    fact[0]=1;
    infact[0]=1;

    for(int i=2;i<N-1;i++){
        fact[i]=fact[i-1]*i%mod;
    }
    infact[N-2]=qmi(fact[N-2],mod-2,mod);
    for(int i=N-2;i>1;i--){
        infact[i-1]=infact[i]*i%mod;
    }
}

void solve(){

    init();

    int a,b,c,d;
    cin>>a>>b>>c>>d;

    int cnt=a+c+1;//共有cnt个位置
    int ans=0;

    auto C=[&](int a,int b)-> int{
        if(b>a){
            return 0;
        }
        return fact[a]*infact[b]%mod*infact[a-b]%mod;
    };

    for(int i=cnt;i>=1;i--){
        ans += C(b-1+i-1, b-1) * C(d+min(c+1, cnt-i+1)-1, d) % mod;
        ans%=mod;
    }

    cout<<ans;

}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int ct=1;
    // cin>>ct;

    while(ct--){
        solve();
    }
    return 0;
}
posted @ 2025-05-10 21:55  LYET  阅读(56)  评论(0)    收藏  举报