题目链接:点击打开链接
题目大意:有n行m列学生,有一位老师在课上会问k个问题,在行上,是按照1,2。。。。n-1,n,n-1.。。。1这样的顺序提问,求学生当中回答问题个数最多和最少的个数,以及在第x行第y位的同学回答的问题数。
思路:当n>1时,1,2,……,n-1,n,n-1,……3,2为一个循环节,即有2*n-2行,其中每个循环节第1行以及第n行都只回答一次,其他都回答了两次,然后直接用二维数组进行模拟即可。注意细节的地方。
代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define maxn 500
LL ans[105][105];
const int inf_int = 2e9;
const long long inf_ll = 2e18;
int main()
{
int n,m,x,y;
LL k;
scanf("%d%d%I64d%d%d",&n,&m,&k,&x,&y);
int t;
if(n>1) t = (2*n-2) * m;
else t = m;
for(int i=2;i<n;i++)
{
for(int j=1;j<=m;j++)
{
ans[i][j] = k/t*2;
}
}
for(int j=1;j<=m;j++)
{
ans[1][j] = ans[n][j] = k/t;
}
int p = k % t;
for(int i=1;i<=n && p;i++)
{
for(int j=1;j<=m && p;j++)
{
if(p)
{
ans[i][j]++;
p--;
}
}
}
for(int i=n-1;i>1 && p;i--)
{
for(int j=1;j<=m && p;j++)
{
if(p)
{
ans[i][j]++;
p--;
}
}
}
LL mx = 0, mi = inf_ll;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
mi = min(mi,ans[i][j]);
mx = max(mx,ans[i][j]);
}
}
printf("%I64d %I64d %I64d\n",mx,mi,ans[x][y]);
return 0;
}