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;
}