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\n");
    else printf("NO\n");
    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\n");
                return 0;
            }
        }
       // printf("%d %d %d\n",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\n",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\n",num,co);
    return 0;
}
View Code

 

posted on 2017-06-03 09:15  HelloWorld!--By-MJY  阅读(168)  评论(0编辑  收藏  举报

导航