AtCoder Beginner Contest 360

AtCoder Beginner Contest 360

A - A Healthy Breakfast

判断 R 是否在 M 左边。

点击查看代码
// LUOGU_RID: 163583787
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int n,m;
char s[5];
signed main(){
    ios::sync_with_stdio(0);
    // cin>>n>>m;
    cin>>s;
    if((s[0]=='R'&&s[1]=='M')||(s[0]=='R'&&s[2]=='M')||(s[1]=='R'&&s[2]=='M')){
        cout<<"Yes";
    }else{
        cout<<"No";
    }
    return 0;
}

B - Vertical Reading

问题陈述

您将得到两个字符串 \(S\)\(T\) ,它们由小写英文字母组成。

判断是否存在一对整数 \(c\)\(w\) ,使得 \(1 \leq c \leq w< |S|\) 满足以下条件。这里, \(|S|\) 表示字符串 \(S\) 的长度。注意 \(w\) 必须小于 \(|S|\)

—如果 \(S\) 从开头开始按每 \(w\) 字符分割,则长度至少为 \(c\) 的子字符串的第 \(c\) th个字符的顺序等于 \(T\)

圣经题目。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int n,m;
char s[503],t[403];
signed main(){
    ios::sync_with_stdio(0);
    cin>>s>>t;
    int g=strlen(s),h=strlen(t);
    for(int w=1;w<g;w++){
        for(int c=1;c<=w;c++){
            int f=1;
            for(int i=0;t[i];i++){
                if(i*w+c-1>=g||t[i]!=s[i*w+c-1]){
                    f=0;
                    break;
                }
            }
            if(f){
                if(h*w+c-1<g){
                    f=0;
                }
            }
            if(f){
                cout<<"Yes";
                return 0;
            }
        }
    }
    cout<<"No";
    return 0;
}

C - Move It

问题陈述

有编号为 \(1\)\(N\)\(N\) 盒和编号为 \(1\)\(N\)\(N\) 项。物品 \(i\) \((1 \leq i \leq N)\) 在箱子 \(A_i\) 中,重量为 \(W_i\)

您可以重复执行零次或多次选择一个项目并将其移动到另一个框的操作。如果要移动的物品的权重为 \(w\) ,则操作的成本为 \(w\)

找出使每个箱子只装一件物品所需的最小总成本。

移走每个有多余东西的格子中权值小的即可。

点击查看代码
// LUOGU_RID: 163584157
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int n,m;
priority_queue<int,vector<int>,greater<int> >q[maxn];
int pos[maxn],val[maxn];
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>pos[i];
    }
    for(int i=1;i<=n;i++){
        cin>>val[i];
        q[pos[i]].push(val[i]);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        while(q[i].size()>1){
            ans+= q[i].top();
            q[i].pop();
        }
    }
    cout<<ans;
    return 0;
}

D - Ghost Ants

有一些🐜,向左/右走,速度为 \(1\),求 \((T+0.1)\) 时间内,互相穿过的🐜的对数。

转化题意,可以发现只要固定一边的🐜,另一边的🐜走 \(2T\) 就行。二分处理出 \(t_i\) 为🐜\({}_i\) 无法经过的数量,\(s_i\) 为🐜\({}_i\) 走了 \(2T\) 后位置大于向另一个方向走的🐜的数量,则答案为 \(\sum (s_i-t_i)\)

点击查看代码
// LUOGU_RID: 163584342
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int n,t;
int pos[maxn],dx[maxn];
int l[maxn],r[maxn],lcnt,rcnt,num[maxn];
signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        char c;
        cin>>c;
        dx[i]=c-'0';
    }
    for(int i=1;i<=n;i++){
        cin>>pos[i];
        if(!dx[i]){
            l[++lcnt]=pos[i];
        }else{
            r[++rcnt]=pos[i];
        }
    }
    int ans=0;
    sort(l+1,l+lcnt+1);
    for(int i=1;i<=rcnt;i++){
        num[i]=lower_bound(l+1,l+lcnt+1,r[i])-l-1;
        // cout<<num[i]<<" \n"[i==rcnt];
    }
    for(int i=1;i<=lcnt;i++) l[i]-=t;
    for(int i=1;i<=rcnt;i++){
        int s=upper_bound(l+1,l+lcnt+1,r[i]+t)-l-1,t=num[i];
        ans+=s-t;
        // cout<<s<<' '<<t<<'\n';
    }
    cout<<ans;
    return 0;
}

E - Random Swaps of Balls

F - InterSections

G - Suitable Edit for LIS

posted @ 2024-07-01 16:00  view3937  阅读(58)  评论(0编辑  收藏  举报
Title