天天看点

codeforces #325

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[];
int n;
int main()
{
    cin>>n;
    for(int i=;i<n;i++)
    {
        cin>>a[i];
    }
    a[n]=;
    int ans=;
    for(int i=;i<n-;i++)
    {
        if(a[i]==)
        {
            if((!a[i+])&&(a[i+]))
                a[i+]=;
        }
    }
    for(int i=;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[];
int b[];
int c[];
int pa[],pb[];
int q[55];
int n;

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