比赛地址: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; }