A. Find Square
我们分别正着、反着搜一遍矩阵,找到只含有"W"的子矩阵的左上角与右下角
那么中心的x坐标就是两点(左上角和右下角)x坐标的和的一半,y坐标也一样。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
char c=getchar();int num=0;int f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
return num*f;
}
inline void qwq(int x){
if(x>9)qwq(x/10);
putchar(x%10+'0');
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
qwq(x);
}
char maps[120][120];
int co[5];
int main(){
int n=read();int m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maps[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(maps[i][j]=='B'){
co[1]=i;co[2]=j;break;
}
}
if(co[1])break;
}
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
if(maps[i][j]=='B'){
co[3]=i;co[4]=j;break;
}
}
if(co[3])break;
}
int ansx=(co[1]+co[3])/2;int ansy=(co[2]+co[4])/2;
write(ansx);putchar(' ');write(ansy);putchar('\n');
return 0;
}
B. Unnatural Conditions
这道题很奇葩呀。。。我们可以构造出一对(a,b)使得他对于该题的任何一组数据都合法。
首先这对(a,b)的数位和都大于1129即可,至于s(a+b)<=m的构造方法,
我们可以使得(a+b)的数位和为1,即a+b=10^k(k为整数)。
总的方案个数不少,
作者想到的是55.....5和45.......5。
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
inline int read(){
char c=getchar();int num=0;int f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
return num*f;
}
inline void qwq(int x){
if(x>9)qwq(x/10);
putchar(x%10+'0');
}
inline void write(int x){
if(x<0){x=-x;putchar('-');}
qwq(x);
}
int main(){
int n=read();int m=read();
rep(i,1,300){
write(5);
if(i==300)putchar('\n');
}
rep(i,1,300){
write(5-(i!=300));
if(i==300)putchar('\n');
}
return 0;
}
C. Rectangles
我们先计算出同时位于n个矩形的点所在的范围,用于题目中一样的表示方式,这个范围就是(lx,ly),(rx,ry)。
若该范围合法,那没我们就直接输出。若不合法,我们枚举删掉哪个矩阵,使得范围合法。最后输出lx,ly即为一个可行答案。
计算同时位于n个矩形的点的范围的方法就是,对所有fx,fy取最大值,对所有sx,sy取最小值。
而删掉一个矩阵后的范围倒推一下即可。(自行配合程序理解一下吧)
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
inline int read(){
char c=getchar();int num=0;int f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
return num*f;
}
struct wzy{
int fx,fy,sx,sy;
}co[140010];
int temp1[140010];int temp2[140010];
int temp3[140010];int temp4[140010];
inline bool cmp(int a,int b){
return a>b;
}
int main(){
int n=read();
rep(i,1,n){
co[i].fx=read();co[i].fy=read();temp1[i]=co[i].fx;temp2[i]=co[i].fy;
co[i].sx=read();co[i].sy=read();temp3[i]=co[i].sx;temp4[i]=co[i].sy;
}
sort(temp1+1,temp1+n+1,cmp);sort(temp2+1,temp2+n+1,cmp);
sort(temp3+1,temp3+n+1);sort(temp4+1,temp4+n+1);
int lx,ly,rx,ry;
lx=temp1[1];ly=temp2[1];rx=temp3[1];ry=temp4[1];
if(lx<=rx&&ly<=ry){
cout<<lx<<" "<<ly<<endl;
return 0;
}
rep(i,1,n){
if(co[i].fx==lx){lx=temp1[2];}
if(co[i].fy==ly){ly=temp2[2];}
if(co[i].sx==rx){rx=temp3[2];}
if(co[i].sy==ry){ry=temp4[2];}
if(lx<=rx&&ly<=ry){
cout<<lx<<" "<<ly<<endl;
return 0;
}
lx=temp1[1];ly=temp2[1];rx=temp3[1];ry=temp4[1];
}
return 0;
}
有时间还会继续更这场比赛的后续几道题的哟~~~