Codeforces 581D Three Logos

Codeforces Tutorial

D. Three Logos

Problem Analysis

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

\[\begin{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} \]


\[\begin{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\n");
            return 0;
        }
    }
    /// test 44 用最终状态来确定是否可行,
    if(x*y!=0){
        printf("-1\n");
        return 0;
    }
    printf("%d\n",edge);
    for(int ii=1;ii<=edge ;ii++ ){
        printf("%s\n",billboard[ii]+1);
    }
}

Wrong Answer Cases

Test 8

有遗漏的情况

Test43

无解的情况

Test43

无解的情况

What I Learn

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

Reference

posted @ 2019-06-19 14:14  MalcolmMeng  阅读(156)  评论(0编辑  收藏  举报