比赛地址:http://codeforces.com/contest/586
A题
Alena 有个课程表,有n节课,她总是想回家,如果两个1中间有大于等于两个0的话,她就能回家。
小trick:最前面有0,意味着她还在家,后面有零,意味着她已经从学校回家了,处理一下就好。
AC代码:
By mmddd, contest: Codeforces Round #325 (Div. 2), problem: (B) Laurenty and Shop, Accepted, #
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
int s1[500],s2[500],ss1[500],ss2[500],r[500];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1; i<=n-1; i++)
{
scanf("%d",&s1[i]);
}
ss1[n]=0;
for(int i=n-1; i>=1; i--)
{
ss1[i]=ss1[i+1]+s1[i];
}
for(int i=1; i<=n-1; i++)
{
scanf("%d",&s2[i]);
}
ss2[n]=0;
for(int i=n-1; i>=1; i--)
{
ss2[i]=ss2[i+1]+s2[i];
}
for(int i=1; i<=n; i++)
{
scanf("%d",&r[i]);
}
int max1=INF;
int k1;
int vis[500];
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
int sum=0;
sum+=r[i];
sum+=ss2[i];
sum=sum+ss1[1]-ss1[i];
if(sum<max1)
{
k1=i;
max1=sum;
}
}
vis[k1]=1;
int max2=INF;
for(int i=1; i<=n; i++)
{
if(vis[i]==0)
{
int sum=0;
sum+=r[i];
sum+=ss2[i];
sum=sum+ss1[1]-ss1[i];
if(sum<max2)
{
k1=i;
max2=sum;
}
}
}
printf("%d
",max1+max2);
}
return 0;
}
B题
好像A B题永远都是水题,日刷水题三百道其实也不错。
题意:根据他给的图猜题意就好,从右下到左上,只能过一次路,也就意味着路径是唯一的,不能转个圈什么的就简单多了,
遍历两边就好,第一遍找出最短的路线,把过路的路口标记一下,然后遍历第二遍,找出第二段的路径,相加即为所求。
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int vis[500];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
scanf("%d",&vis[i]);
}
int sum=0;
int cnt=0;
int k;
for(int i=1;i<=n;i++)
{
if(vis[i]==1)
{
k=i;
break;
}
}
for(int i=k; i<=n; i++)
{
if(vis[i]==1)
{
if(cnt==1)
{
sum++;
}
sum++;
cnt=0;
}
else if(vis[i]==0)
{
cnt++;
}
}
printf("%d
",sum);
}
return 0;
}