题意:在一个教室中老师按照学生的做的情况来确定出勤,确定规则是找到每一列的最大值然后找到每一行的最大值,然后取两者的最小值来衡量学生的出勤情况,现在给你出勤人数然后让你写出一种坐的方案,使老师计算的出勤最大
思路:先确定最大情况的行列的人的个数然后把它们安排在第一行和第一列,然后剩下的随便填在其他位置,这种方案就可以了
ac代码;
using namespace std;
char a[105][105];
int main(){
freopen("class.in","r",stdin); freopen("class.out","w",stdout);
int n,c,m;
while(cin>>n>>c>>m)
{
for(int i=1;i<=c;i++)
{
for(int j=1;j<=m;j++)
a[i][j]='.';
}
int min1;
int c1,m1;
if(n>=c+m-1)
{
min1=min(c,m);
c1=c,m1=m;
}
else
{
if(n/2>=min(c,m))
{
min1=min(c,m);
if(c>m)
{
c1=n-min(c,m)+1;m1=min(c,m);
}
else
{
c1=min(c,m);m1=n-min(c,m)+1;
}
}
else
{
if(n==1)
min1=1;
else
{
if(n%2==0)
min1=n/2;
else
min1=n/2+1;
}
if(n%2==0)
{c1=n/2;m1=n/2+1;}
else
{
if(c>=m)
{
c1=n/2+1;m1=n/2+1;
}
else
{
m1=n/2+1;c1=n/2+1;
}
}
}
}
cout<<min1<<endl;
for(int i=1;i<=c1;i++)
a[i][1]='#';
for(int j=1;j<=m1;j++)
a[1][j]='#';
int sum=0;
int p=0;
for(int i=1;i<=c;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]!='#')
{
if(sum==n-c1-m1+1)
{
p=1;
break;
}
a[i][j]='#';
sum++;
}
}
if(p==1)
break;
}
for(int i=1;i<=c;i++)
{
for(int j=1;j<=m;j++)
printf("%c",a[i][j]);
cout<<endl;
}
}
return 0;
}