zoukankan      html  css  js  c++  java
  • Codeforces Round #325 (Div. 2) A B

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

      

  • 相关阅读:
    ASP.NET Core 添加统一模型验证处理机制
    【Spark】开发Spark选择Java还是Scala?
    【设计模式】单例模式-为什么是静态变量
    【Spark】SparkStreaming-如何使用checkpoint
    【Java】Java-ShutDownHook-优雅关闭系统资源
    【Scala】Scala-None-null引发的血案
    【Spark】SparkStreaming-输出到Kafka
    【Spark】Spark-Redis连接池
    【Spark】提交Spark任务-ClassNotFoundException-错误处理
    【大数据】王加林-大数据学习资料
  • 原文地址:https://www.cnblogs.com/qioalu/p/4875698.html
Copyright © 2011-2022 走看看