codeforces #325

本文提供Codeforces Round #325中A题Alena's Schedule和B题Laurenty and Shop的详细解答。A题通过遍历字符串并调整1后紧跟01的模式来计算在校时间;B题则利用前缀和后缀和快速找出两种最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codeforces Round #325 题解

打得太烂。。本以为过了三题结果第三题FST,wa12了,还没改好,先写AB两水的吧
P.S. 事实上是想试试markdown编辑的感觉,这篇暂时没什么营养的题解是用markdown编辑的

A:Alena’s Schedule

题意:一个人去学校上课,每天的课程安排表示为一串0与1的数字,1代表这个时候有课,0代表没课,主人公保证在每天的第一节课的时候到校(不迟到但也不提前到),而他又很注意休息,每当他上完一节课后,如果他接下来有连续两节课以上的时间没有课,那么他就回家休息,如果只有一节课的空闲或者没有空闲就继续呆在学校。如果发现全天的课已经全部上完,就立刻回家。 给出课程安排,计算全天的在校时间。
不难处理,我们只需要遍历这个数串(规模很小。。)对每一个“1”,看它后两位,如果是“01”,对应不回家休息的情况,就把那个0抹成1就行
这样处理完之后,再统计改写后的数串有多少个1就行了
然而有一个问题不容忽视,在这种处理下,最后一个数位可能只有一个0,而被处理为继续留在学校,而实际情况是直接回家,所以为了补救,我们在最后一位之后再添加一个0
code:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<cstdlib>

#define maxn 201314
#define inf 0x3f3f3f3f
#define LL long long

using namespace std;
int a[110];
int n;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    a[n]=0;
    int ans=0;
    for(int i=0;i<n-1;i++)
    {
        if(a[i]==1)
        {
            if((!a[i+1])&&(a[i+2]))
                a[i+1]=1;
        }
    }
    for(int i=0;i<n;i++)
    {
        if(a[i])ans++;
    }
    cout<<ans<<endl;
}
B:Laurenty and Shop

题意:一个小镇的格局是:两排房屋,每排n个。现在主人公想从第一排的第一个走到第二排的最后一个。同一排所有相邻房屋之间的过路时间给出,两排之间相同位置的房屋之间的过路时间给出,求两条不相同的尽量短路径。
路径是有要求的,由于主人公一定会从第一排穿到第二排,题目要求单程只能穿马路一次,这意味着路径是个最简单的折线形。
乍一看还以为是搜索或者dp,吓一跳。。仔细一看,路径只有n种,把他们都找出来排序(规模很小,直接快排),输出最短的那两个即可。
找路径的方法不难写,感觉这段写的挺好的,维护第一排道路的前缀和,第二排的后缀和

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<cstdlib>

#define maxn 201314
#define inf 0x3f3f3f3f
#define LL long long

using namespace std;
int a[55];
int b[55];
int c[55];
int pa[55],pb[55];
int q[55];
int n;

int main()
{
    cin>>n;
    pa[0]=0;
    for(int i=1;i<=n-1;i++)
    {
        cin>>a[i];
        pa[i]=pa[i-1]+a[i];
    }
    for(int i=1;i<=n-1;i++)
    {
        cin>>b[i];
    }
    pb[n+1]=0;
    for(int i=n;i>=1;i--)
    {
        pb[i]=pb[i+1]+b[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>c[i];
        q[i]=pa[i]+c[i]+pb[i+1];
    }
    sort(q,q+n);
    int ans=q[0]+q[1];
    cout<<ans<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值