zoukankan      html  css  js  c++  java
  • CF 812

    A 直接模拟 

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
    
        char map[17][17];
        int i, j;
        for (i = 1; i <= 4; i++){
            for (j = 1; j <= 4; j++){
                scanf("%d", &map[i][j]);
            }
        }
        int ok = 0;
        for (i = 1; i <= 4; i++){
            if (map[i][4] == 1){
            for (j = 1; j <= 3; j++){
                if (map[i][j]){
                    ok = 1;
                    break;
                }
                int a = (i + j) % 4;
                if (a == 0)a = 4;
                if (map[a][j]){
                    ok = 1;
                    break;
                }
            }
            }
            if (ok)break;
        }
        if (ok)printf("YES
    ");
        else printf("NO
    ");
        return 0;
    }
    View Code

    B n m  

    n 行 m+2列  旁边2列是楼梯

    一开始站在左下角  问 要关掉所有的灯  1   最少走多少步   不能下楼 

    dp[i][0]  dp[i][1]  表示这一层从左边出来  从右边出来

    dp[i][0]=min(dp[i-1][0]+... , dp[i-1][1]+...);  挺好想的   还有一些细节

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    
    using namespace std;
    
    #define MAXN 10002
    #define inf  1000000007
    #define ll long long
    #define exp 1e-8
    
    char z[25][105];
    int  dp[25][2];
    int l[25],r[25];
    
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int c1=n;
        for(int i=1;i<=n;i++)
       {
            scanf("%s",z[i]+1);
            r[i]=100;
            for(int j=1;j<=m+2;j++)
            {
                if(z[i][j]=='1')
                {
                    c1=min(c1,i);
                    l[i]=max(l[i],j);
                    r[i]=min(r[i],j);
                }
            }
       }
    
        for(int i=n;i>c1;i--)
        {
            if(i==n)
            {
                if(l[i]==0)
                    dp[i][0]=0;
                else
                    dp[i][0]=l[i]-1+l[i]-1;
                dp[i][1]=m+2-1;
            }
            else
            {
                int a=dp[i+1][0]+1,a1=dp[i+1][1]+1;
                if(l[i]!=0)
                {
                    a+=(l[i]-1)*2;
                }
                a1=a1+m+1;
                dp[i][0]=min(a,a1);
                int b=dp[i+1][0]+1,b1=dp[i+1][1]+1;
                b=b+m+1;
                if(r[i]!=100)
                {
                    b1=b1+(m+2-r[i])*2;
                }
                dp[i][1]=min(b,b1);
            }
    
    
        }
            if(c1==n)
            {
                if(l[c1]==0)
                {
                    printf("0
    ");
                    return 0;
                }
            }
           // printf("%d %d %d
    ",c1+1,dp[c1+1][0],dp[c1+1][1]);
            int a=dp[c1+1][0]+l[c1];
            int a1=dp[c1+1][1]+(m+2-r[c1])+1;
            if(c1==n)
            {
                 a--;
                 a1=l[c1]-1;
            }
    
            printf("%d
    ",min(a,a1));
        return 0;
    }
    /*
    2 2
    0000
    0100
    
    2 2
    0100
    0000
    3 2
    0100
    0000
    0100
    
    */
    View Code

    C   n  s

    给你n个物品的费用  然后总的钱  1 满足 买的个数最多  2 满足花费少  

    买k个的花费是  a(i)+i*k

    二分k  然后 排序nlogn

    时间nlongnlogn

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<math.h>
    
    using namespace std;
    
    #define MAXN 100002
    #define inf  1000000007
    #define ll __int64
    #define exp 1e-8
    
    ll z[MAXN];
    ll x[MAXN];
    
    int main()
    {
        int n;
        ll s;
        scanf("%d%I64d",&n,&s);
        for(int i=1;i<=n;i++)
            scanf("%I64d",&z[i]);
        int l,r;
        l=0;
        r=n;
        int num;
        ll co;
        num=0;
        co=0;
    
        while(l<=r)
        {
            int mid=(l+r)>>1;
            for(ll i=1;i<=n;i++)
            {
                x[i]=z[i]+i*mid;
            }
            sort(x+1,x+n+1);
            ll sum=0;
            for(ll i=1;i<=mid;i++)
                sum=sum+x[i];
            if(sum>s)
                r=mid-1;
            else
            {
                l=mid+1;
                if(mid>num)
                {
                    num=mid;
                    co=sum;
                }
                else if(mid==num&&co<sum)
                {
                    co=sum;
                }
            }
        }
        printf("%d %I64d
    ",num,co);
        return 0;
    }
    View Code
  • 相关阅读:
    分布式共识协议RAFT基本原理
    slave_net_timeout, MASTER_HEARTBEAT_PERIOD, MASTER_CONNECT_RETRY,以及 MASTER_RETRY_COUNT设置和查看
    单例模式
    截取字符串Java
    Hibernate+struts+JqueryAjax+jSON实现无刷新三级联动
    数组集合区别
    Android Activity生命周期(图文)!
    Activity的生命周期
    Android四大组件
    各种时间获取 .net
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6936249.html
Copyright © 2011-2022 走看看