codeforce #381 ABC题解

不去吐槽自己的英文水平,不去吐槽自己的思维局限,只说题目意思和解法


A题

题意:我现在有n本书,现在有3种书的套装可以买,a元买1本的套***元买2本的套装,c元买3本的套装,套装不能拆开卖。问:我最少需要花多少钱,可以使得我的书的总数可以被4整除

分析:n如果直接是4的倍数,答案是0;余数分三种情况:

余数为3:买1本?!不一定!买5本?!买9本?!

因为要求是花最少的钱,那么买多少本书其实不重要,有多少种花钱方式比较重要(类似dp的思维)

买1本:花a元;买5本,花b+c元;买9本,花3*c元(这些都是有可能构成最小花费的)

余数为2和余数为1也是相同的思考方法

来说两种代码:一种dp,一种枚举的

#include<bits/stdc++.h>
using namespace std;

#define LL __int64
LL n,a,b,c,ans;
LL dp[100];

int main(){
    while(cin>>n>>a>>b>>c){
        dp[1]=a;
        dp[2]=min(dp[1]+a,b);
        dp[3]=min(c,min(dp[2]+a,dp[1]+b));
        for(int i=4;i<=10;i++)
            dp[i]=min(dp[i-1]+a,min(dp[i-2]+b,dp[i-3]+c));
        if (n%4==0) puts("0");
        else if (n%4==1) cout<<min(dp[3],dp[7])<<endl;
        else if (n%4==2) cout<<min(dp[2],dp[6])<<endl;
        else cout<<min(dp[1],min(dp[5],dp[9]))<<endl;
    }
    return 0;
}

#include<bits/stdc++.h>
using namespace std;

#define LL __int64
LL n,a,b,c,ans;
LL dp[100];

int main(){
    while(cin>>n>>a>>b>>c){
        if (n%4==0) ans=0;
        else if (n%4==1){
            ans=c;
            ans=min(3*a,ans);
            ans=min(a+b,ans);
        }
        else if (n%4==2){
            ans=b;
            ans=min(a+a,ans);
            ans=min(c+c,ans);
        }
        else{
            ans=a;
            ans=min(b+c,ans);
            ans=min(3*c,ans);
        }
        cout<<ans<<endl;
    }
    return 0;
}


B题:看懂了题的话,要求最大值:我们只需要去判断每个的计算是不是正的

要计算【a,b】区间内的和,必须用前缀和啊,所以就暴力跑一圈吧,注意初始化是0就好了


#include<bits/stdc++.h>
using namespace std;

const int maxn=150;
int n,m;
int a[maxn];
int sum[maxn];

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        sum[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i]=a[i]+sum[i-1];
        }
        int ans=0,u,v;
        while(m--){
            scanf("%d%d",&u,&v);
            if (sum[v]-sum[u-1]>0) ans+=sum[v]-sum[u-1];
        }
        printf("%d\n",ans);
    }
    return 0;
}


C题:读题是个很麻烦的事情:重点应该是这句话的吧

The mex of a set S is a minimum possiblenon-negative integer that is not in S.

在集合S中mex这个值,是S集合中的没有出现过的最小的非负整数(会博弈论的话,SG函数要用这个)

m个区间中都取mex,然后找到这样的最大值

 

其实:答案很简单:就是最小的区间长度:想想为什么?

因为没有出现过的最小的非负整数!意思是:我们要想那个值最大,就必须从0开始起来编号对吧

拿第一个样例来说,我们必须0 1 0 1的编号,那么答案才会是2(最小的区间长度)

那么,这个题就成了简单构造题



#include<bits/stdc++.h>
using namespace std;

int n,m,u,v;

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        int ans=n+1;
        while(m--){
            scanf("%d%d",&u,&v);
            ans=min(ans,v-u+1);
        }
        printf("%d\n",ans);
        for(int i=1;i<=n;i++)
            printf("%d%c",i%ans,i==n?'\n':' ');
    }
    return 0;
}




全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440737次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41503次浏览 524人参与
# 北方华创开奖 #
107313次浏览 599人参与
# 地方国企笔面经互助 #
7930次浏览 18人参与
# 同bg的你秋招战况如何? #
75684次浏览 552人参与
# 虾皮求职进展汇总 #
114355次浏览 884人参与
# 阿里云管培生offer #
119887次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454094次浏览 34848人参与
# 实习必须要去大厂吗? #
55687次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149836次浏览 1977人参与
# 投递实习岗位前的准备 #
1195731次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661934次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11381次浏览 271人参与
# 发工资后,你做的第一件事是什么 #
12431次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35621次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451933次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39241次浏览 314人参与
# 非技术岗是怎么找实习的 #
155852次浏览 2120人参与
牛客网
牛客企业服务