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
有遗漏的情况
无解的情况
无解的情况
What I Learn
3
这个数字经常被用来设计题目- 变量使用完之后一定要进行有效性检验