zoukankan      html  css  js  c++  java
  • 叉姐的魔法训练(第十课)---- 幽默大师卫冕战

    挖坑

    ------------------------

    一 构造矩阵

    SGU 409 Berland Flag

    构造在一个边长为n*n(也就是说面积为n*n*n*n的)正方形。正方形中只包含' * '和' . '。
    满足:
    使得将这个正方形分隔成n*n个大小为n*n的正方形之后,每个小正方形里都刚好有k个 ' * '
    每行每列都刚好只有k个' * '。
    [solution]
    根据样例推理构造。

    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1005;
    int n,m;
    bool a[maxn][maxn];
    int x,y;
    int main()
    {
        memset(a,0,sizeof(a));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                x=i*n+j;
                y=j*n+i;
                for(int k=0;k<m;k++) a[x][(y+k)%(n*n)]=true;
            }
        }
        for(int i=0;i<n*n;i++){
            for(int j=0; j<n*n; ++j){
                if(!a[i][j]) printf(".");
                else printf("*");
            }
            printf("
    ");
        }
        return 0;
    }
    

    ------------------------

    二 构造棋盘

    SGU 361 National Flag

    要求将n*m的矩阵染上蓝色

    要求,任意一个2*3或3*2的矩阵里都恰好有两个蓝色,并且蓝色数量最少。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    const int maxn=1005;
    const int INF=0x3f3f3f3f;
    bool a[maxn][maxn];
    int n,m;
    int main()
    {
        int Min=INF;
        int p=0;
        int sum=0;
        cin>>n>>m;
        for (int k=0;k<3;k++){
            sum=0;
            for (int i=0;i<n;i++){
                for (int j=(i+k)%3;j<m;j+=3){
                    sum++;
                }
            }
            if (sum<Min){
                Min=sum;
                p=k;
            }
        }
        memset(a,0,sizeof(a));
        for (int i=0;i<n;i++){
            for (int j=(i+p)%3;j<m;j+=3){
                a[i][j]=true;
            }
        }
        for (int i=0;i<n;i++){
            for (int j=0;j<m;j++){
                if (a[i][j]) cout<<'#';
                else cout<<'0';
            }
            cout<<endl;
        }
        return 0;
    }
    


    ------------------------

    三 电梯搬运

    SGU 379 Elevator

    一个n层高的大楼只有一个电梯。停车场坐落在一楼之下。楼层编号1~n。

    第i层上有Ai个人想去停车场。电梯载人数不能超过C。电梯移动一层用时P分钟。

    找到在T分钟内最多有多少人能到达停车场。电梯装载人不需要时间。

    二分最大人数。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    typedef long long LL;
    const int maxn=111;
    int n,C,P,T;
    int a[maxn];
    int b[maxn];
    bool Can(int ans){
        LL cur=0,toPick;
        int p=0;
        for (int i=1;i<=n;i++){
            cur+=a[i];
            if (cur>=ans){
                p=i;
                toPick=ans-(cur-a[i]);
                break;
            }
        }
        LL ret=((toPick-1)/C+1)*p*2;
        int capa=C-(toPick-1)%C-1;
        for (int i=p-1;i>=1;i--){
            if (a[i]<=capa){
                capa-=a[i];
            }
            else{
                toPick=a[i]-capa;
                ret+=((toPick-1)/C+1)*i*2;
                capa=C-(toPick-1)%C-1;
            }
        }
        return ret*P<=T;
    }
    
    int main()
    {
        while (~scanf("%d%d%d%d",&n,&C,&P,&T)){
            LL l=0,r=0;
            for (int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                r+=a[i];
            }
            LL ans=0;
            while (l<=r){
                LL mid=(l+r)>>1;
                if (Can(mid)){
                    ans=mid;
                    l=mid+1;
                }
                else{
                    r=mid-1;
                }
            }
            printf("%I64d
    ",ans);
        }
        return 0;
    }
    


    ------------------------

    ------------------------

    ------------------------

  • 相关阅读:
    报错信息
    交通
    安装Charles代理
    安装Phabricator
    缓存更新问题
    最好的学习资料在官网
    mysql安装
    git使用
    vbox的centos系统挂载win共享目录做web目录www用户权限问题
    一句话解决windows下quick-cocos2d-x中player3打开黑屏问题
  • 原文地址:https://www.cnblogs.com/cyendra/p/3681558.html
Copyright © 2011-2022 走看看