我好菜 不——开————心——————
【A. Find Square】
原题小链接:https://codeforces.com/problemset/problem/1028/A
题目大意:给出一个n*m的矩阵,矩阵中有一个由‘B’组成的正方形(边长为奇数),求正方形的中心点在矩阵中的坐标。
解题思路:只要知道正方形四个顶点的坐标,求中心点就很容易了。所以只需要记录一下正方形行和列的范围,输出两者的中点就ok了
代码
#incIude <bits/stdc++.h>
using namespace std;
const int N=120;
int n,m;
int r1=0x3f3f3f3f,r2,l1=0x3f3f3f3f,l2;
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
char c;
cin>>c;
if (c=='B')
{
r1=min(i,r1);
r2=max(i,r2);
l1=min(l1,j);
l2=max(l2,j);
}
}
}
cout<<(r1+r2)/2<<" "<<(l1+l2)/2;
return 0;
}
【B. Unnatural Conditions】
原题小链接:https://codeforces.com/problemset/problem/1028/B
题目大意:令S(a)表示a数位位上的数字之和,给出n,m,输出a,b,使S(a)>=n,S(b)>=n,S(a+b)<=m
解题思路:因为n,m>=1,我们不妨使得S(a+b)=1,即前面每位的和为9、最后一位和为10,然后使S(a),S(b)>=n便可输出答案
代码
#incIude <bits/stdc++.h>
using namespace std;
int n,m;
string a,b;
int main()
{
cin>>n>>m;
while (n>4)
{
a+=(char)('0'+4);
b+=(char)('0'+5);
n-=4;
}
a+=(char)('0'+5);
b+=(char)('0'+5);
cout<<a<<endl<<b;
return 0;
}
【C. Rectangles】
原题小链接:https://codeforces.com/problemset/problem/1028/C
题目大意:在平面直角坐标系中给出n个矩形,需找到一点(x,y)使得该点至少被n-1个矩形包含(内部或边界)
解题思路:一眼想出取所有矩形x、y的交集,但是这个题可能不能取到所有矩形的坐标的交集。于是乎,需要枚举删除第i个矩形。那么每次怎么操作呢……
预处理出最大的x1、y1与最小的x2、y2(取所有矩形的交集),若最值是在此次删除的矩形中取到的,那么这次就要不取最值而是取次大值、次小值(因为最值的矩形被删了……所以只能取次的值……)
*小小声:刚开始把x、y单拎出来算的,就没有考虑到可能x和y删了2个矩形……然后就挂了
不可爱的代码
#include <bits/stdc++.h>
using namespace std;
int inf=2147483647;
int n;
int mxx[4],mnx[4],mxy[4],mny[4];//1最大值,2次大值,3很好理解
int main()
{
scanf("%d",&n);
mxx[1]=mxy[1]=-inf;
mnx[1]=mny[1]=inf;
for (int i=1;i<=n;i++)
{
int x1,yy1,x2,y2;
scanf("%d%d%d%d",&x1,&yy1,&x2,&y2);
if (x1>=mxx[1])
{
mxx[2]=mxx[1];
mxx[1]=x1;
mxx[3]=i;
}
else mxx[2]=max(mxx[2],x1);
if (x2<=mnx[1])
{
mnx[2]=mnx[1];
mnx[1]=x2;
mnx[3]=i;
}
else mnx[2]=min(mnx[2],x2);
if (yy1>=mxy[1])
{
mxy[2]=mxy[1];
mxy[1]=yy1;
mxy[3]=i;
}
else mxy[2]=max(mxy[2],yy1);
if (y2<=mny[1])
{
mny[2]=mny[1];
mny[1]=y2;
mny[3]=i;
}
else mny[2]=min(mny[2],y2);
}
for (int i=1;i<=n;i++)//枚举删除的矩形
{
int a,b,c,d;
if (i==mxx[3]) a=mxx[2];
else a=mxx[1];
if (i==mnx[3]) b=mnx[2];
else b=mnx[1];
if (i==mxy[3]) c=mxy[2];
else c=mxy[1];
if (i==mny[3]) d=mny[2];
else d=mny[1];
if (a<=b&&c<=d)
{
printf("%d %d",a,c);
break;
}
}
return 0;
}