AtCoder Beginner Contest 365(5/7)

比赛链接:https://atcoder.jp/contests/abc365

solve:ABC

开头:

感觉好久没打abc了,这场被D单防了qwq,该好好练练dp了

A. Leap Year

思路:

签到题,闰年判断

代码:
#include<bits/stdc++.h>
using i64=long long;

void solve(){
    int n;
    std::cin>>n;
    if(n%400==0){
        std::cout<<366;
    }
    else if(n%100==0&&n%400!=0){
        std::cout<<365;
    }
    else if(n%4==0){
        std::cout<<366;
    }
    else{
        std::cout<<365;
    }
}

int main(){
    std::cin.tie(nullptr);
    std::ios_base::sync_with_stdio(false);

    solve();
}

B. Second Best

思路:

也是签到题

代码:
#include<bits/stdc++.h>
using i64=long long;

void solve(){
    int n;
    std::cin>>n;
    std::vector<int> a(n+1),b(n+1);
    for(int i=1;i<=n;i++){
        std::cin>>a[i];
        b[i]=a[i];
    }
    sort(a.begin()+1,a.end());
    for(int i=1;i<=n;i++){
        if(b[i]==a[n-1]){
            std::cout<<i;
            return;
        }
    }
}

int main(){
    std::cin.tie(nullptr);
    std::ios_base::sync_with_stdio(false);

    solve();
}

C. Transportation Expenses

思路:

标准的二分答案,如果所有人的费用总和比预算少,那么限额就可以是无限大

代码:
#include<bits/stdc++.h>
using i64=long long;
std::vector<i64> a;
i64 n,m;

bool check(i64 x){
    i64 sum=0;
    for(i64 i=1;i<=n;i++){
        sum+=std::min(a[i],x);
    }
    if(sum<=m){
        return true;
    }
    else{
        return false;
    }
}

void solve(){
    std::cin>>n>>m;
    a.resize(n+1);
    i64 sum=0;
    i64 ma=0;
    for(i64 i=1;i<=n;i++){
        std::cin>>a[i];
        sum+=a[i];
        ma=std::max(ma,a[i]);
    }
    if(sum<=m){
        std::cout<<"infinite";
        return;
    }
    i64 l=1;i64 r=ma-1;
    while(l<r){
        i64 mid=l+r+1>>1;
        if(check(mid)){
            l=mid;
        }
        else{
            r=mid-1;
        }
        //std::cout<<l<<' '<<r<<'\n';
    }
    std::cout<<r<<'\n';
}

int main(){
    std::cin.tie(nullptr);
    std::ios_base::sync_with_stdio(false);

    solve();
}

D. AtCoder Janken 3

思路:

是很简单的dp,但我好久没做dp了,一直在用贪心求

每一局有三种状态,即可以出剪刀石头布,当出剪刀时,上一局就不能是剪刀,同时如果这局对面出的是布,就赢了,如果对面出的是石头,那么就输了,就给它赋值为无穷小,最后求最大

代码:
#include<bits/stdc++.h>
using i64=long long;


void solve(){
    int n;
    std::cin>>n;
    std::string s;
    std::cin>>s;
    s='0'+s;
    int INF=0x3f3f3f3f;
    std::vector<std::vector<int>> dp(n+1,std::vector<int>(3,-INF));
    dp[0][0]=0;dp[0][1]=0;dp[0][2]=0;
    for(int i=1;i<=n;i++){
        dp[i][0]=std::max(dp[i-1][1],dp[i-1][2])+(s[i]=='S');//状态转移方程
        dp[i][1]=std::max(dp[i-1][0],dp[i-1][2])+(s[i]=='R');
        dp[i][2]=std::max(dp[i-1][0],dp[i-1][1])+(s[i]=='P');
        if(s[i]=='R'){
            dp[i][2]=-INF;
        }
        else if(s[i]=='P'){
            dp[i][0]=-INF;
        }
        else{
            dp[i][1]=-INF;
        }
    }
    std::cout<<std::max({dp[n][0],dp[n][1],dp[n][2]})<<'\n';
}

int main(){
    std::cin.tie(nullptr);
    std::ios_base::sync_with_stdio(false);

    solve();
}

E. Xor Sigma Problem

思路:

看了看别人的题解发现这就是灵茶八题的第三题,赶紧去补了一下灵茶八题

这道题将利用了二进制拆位,将每一位单独计算贡献,每一位上1有x个,那么这一位的贡献就是x*(n-x+1)*(1<<k)

代码:
#include<bits/stdc++.h>
using i64=long long;

void solve(){
    i64 n;
    std::cin>>n;
    std::vector<i64> a(n+1);
    i64 sum=0;
    for(i64 i=1;i<=n;i++){
        std::cin>>a[i];
        sum+=a[i];
        a[i]^=a[i-1];
    }
    i64 res=0;
    for(i64 i=0;i<30;i++){
        i64 cnt=0;
        for(i64 j=0;j<=n;j++){
            cnt+=a[j]>>i&1;
        }
        res+=cnt*(n-cnt+1)*(1ll<<i);
    }
    std::cout<<res-sum<<'\n';
}

int main(){
    std::cin.tie(nullptr);
    std::ios_base::sync_with_stdio(false);

    solve();
}

F. Takahashi on Grid(待补)

思路:
代码:

G. AtCoder Office(待补)

思路:
代码:
posted @   lime_wk  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示