• Codeforces 581D Three Logos


    Codeforces Tutorial

    D. Three Logos

    Problem Analysis

    从结果出发进行构造
    从下面的图可以看出每添加一个logo,剩余的一定是一个矩形,否则无解
    维护剩余矩形的左上角点的坐标((px,py)),右下角点的坐标为((n,n))(n)为最大边长
    每加入一个矩形,更新状态。

    [egin{matrix} B&B&B&B&B&B \ B&B&B&B&B&B \ A&A&A&A&C&C \ A&A&A&A&C&C \ A&A&A&A&C&C \ A&A&A&A&C&C \ end{matrix} ]


    [egin{matrix} B&B&B&B&B&B \ B&B&B&B&B&B \ A&A&A&A& & \ A&A&A&A& & \ A&A&A&A& & \ A&A&A&A& & \ end{matrix} ]

    Acepted Code

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<istream>
    #include<cassert>
    #include<set>
    #define DEBUG(x) cout<<#x<<" = "<<x<<endl
    #define DEBUG2(x,y) cout<<#x<<" = "<<x<<" , "
    <<#y<<" = "<<y<<endl
    using namespace std;
    typedef long long ll;
    const int MAXN=110;
    char billboard[MAXN][MAXN];
    struct logo{
        int x,y,idx;
    };
    logo lgs[3];
    bool cmp(logo &l1,logo &l2)
    {
        if(l1.x!=l2.x)return l1.x>l2.x;
        return l1.y>l2.y;
    }
    void fillboard(int x1,int y1,int x2,int y2,char ctg)
    {
        for(int ii=x1;ii<=x2 ;ii++ ){
            for(int jj=y1;jj<=y2 ;jj++ ){
                billboard[ii][jj]=ctg;
            }
        }
    }
    /// 3 这个数字经常被用来设计题目
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int edge=-1;
        for(int ii=0;ii<3 ;ii++ ){
            scanf("%d%d",&lgs[ii].x,&lgs[ii].y);
            lgs[ii].idx=ii;
            if(lgs[ii].x<lgs[ii].y)swap(lgs[ii].x,lgs[ii].y);
            edge=max(edge,lgs[ii].x);
        }
        sort(lgs,lgs+3,cmp);
        int px=1,py=1;
        int x=edge,y=edge;
        for(int ii=0;ii<3 ;ii++ ){
            /// test 43 贪心不够彻底
            if(x==lgs[ii].x){
                fillboard(px,py,edge,edge,'A'+lgs[ii].idx);
                py+=lgs[ii].y;
                y-=lgs[ii].y;
            }
            else if(x==lgs[ii].y){
                fillboard(px,py,edge,edge,'A'+lgs[ii].idx);
                py+=lgs[ii].x;
                y-=lgs[ii].x;
            }
            else if(y==lgs[ii].x){
                fillboard(px,py,edge,edge,'A'+lgs[ii].idx);
                px+=lgs[ii].y;
                x-=lgs[ii].y;
            }
            else if(y==lgs[ii].y){
                fillboard(px,py,edge,edge,'A'+lgs[ii].idx);
                px+=lgs[ii].x;
                x-=lgs[ii].x;
            }
            else {
                printf("-1
    ");
                return 0;
            }
        }
        /// test 44 用最终状态来确定是否可行,
        if(x*y!=0){
            printf("-1
    ");
            return 0;
        }
        printf("%d
    ",edge);
        for(int ii=1;ii<=edge ;ii++ ){
            printf("%s
    ",billboard[ii]+1);
        }
    }
    
    

    Wrong Answer Cases

    Test 8

    有遗漏的情况

    Test43

    无解的情况

    Test43

    无解的情况

    What I Learn

    • 3 这个数字经常被用来设计题目
    • 变量使用完之后一定要进行有效性检验

    Reference

  • 相关阅读:
    Java学习笔记2.Java标识符和基本数据类型
    Java面试题库(四)
    Eclipse最常用的一些快捷键技巧
    心理学166个现象(很多,别一次看完!)[119]
    Java学习笔记1.Java发展及JDK配置
    SQL操作全集
    J2EE面试题库
    Java面试题库(一)
    Java程序员,面试必读
    Java面试题库(二)
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/11050981.html
Copyright © 2020-2023  润新知