题意是先做在没有被标记的座位上,另一个人随便坐,求n个凳子背涂下的最远距离(全部输出)
这道题 是让我们灵活变通,将问题转化为一个简单的模型。
转化后求得是每个点到四个端点的最大距离
错误思路:
找到最中间的位置,每次往外扩张一个距离,求扩张一个距离的座位个数。
代码实现大致是这样的。WA
#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+5;
int a[N],v[N];
void fprint(int m,int t)
{
for(int i=1;i<=t;i++)
cout<<m<<' ';
}
int main()
{
int T=1;
cin>>T;
while(T--)
{
int m,n;
cin>>m>>n;
if(m<n) swap(m,n);
if(m%2&&n%2)
{
int l=m/2+1,r=n/2+1,add=0,x=1,vm=m/2+n/2;
fprint(vm,1);
while(x<m*n)
{
if(l>1)
{
l--,add+=2;
}
else if(l==1)
{
l--;
}
else add-=2;
if(r>1)
{
r--;add+=2;
}
else if(r==1)
{
r--;
}
else add-=2;
vm++;
if(m*n-x<=4) fprint(vm,m*n-x);
else fprint(vm,add);
x+=add;
}
}
else if(m%2==0&&n%2==0)
{
int l=m/2+1,r=n/2+1,add=0,x=0,vm=m/2+n/2-1,t=2;
while(x<m*n)
{
if(l>1)
{
l--,add+=2;
}
else if(l==1)
{
l--;
}
if(r>1)
{
r--;add+=2;
}
else if(r==1)
{
r--;
}
if(r==0&&&l==0)
{
add-=4;
}
vm++;
if(m*n-x<=4) fprint(vm,m*n-x);
else fprint(vm,add);
x+=add;
}
}
else
{
int l=m/2+1,r=n/2+1,add=2,x=2,vm=m/2+n/2;
fprint(vm,add);
while(x<m*n)
{
if(l>1)
{
l--,add+=2;
}
else if(l==1)
{
l--;
}
else add-=2;
if(r>1)
{
r--;add+=2;
}
else if(r==1)
{
r--;
}
else add-=2;
vm++;
if(m*n-x<=4) fprint(vm,m*n-x);
else fprint(vm,add);
x+=add;
}
}
cout<<'\n';
}
return 0;
}