n m 教室大小 k 个问题 人在 x y
一行的 询问顺序 从左到右
一列的顺序
1 2 .. n-1 n n-1 ... 1
找出循环结 然后小部分模拟
1 2 ... n-1 n n-1 .. 2
然后就和第一次一样了
然后特殊情况 我分开了
long long
#include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<set> #include<string> using namespace std; typedef long long LL; #define inf 10000000000000 #define MAXN 110 LL cnt[MAXN][MAXN]; int main() { int n,m,x,y; LL k; while(scanf("%d%d%lld%d%d",&n,&m,&k,&x,&y)!=EOF) { memset(cnt,0,sizeof(cnt)); if(n==1) { for(int i=1;i<=m;i++) cnt[1][i]=k/m; int en=k%m; for(int i=1;i<=en;i++) cnt[1][i]+=1; } else { int mod=n*m+(n-2)*m; LL num=k/mod; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(i==1||i==n) cnt[i][j]=num; else cnt[i][j]=2*num; } } int en=k%mod; for(int i=1;i<=n;i++) { for(int j=1;j<=m&&en>0;j++,en--) cnt[i][j]++; } if(en>0) { for(int i=n-1;i>=2;i--) { for(int j=1;j<=m&&en>0;j++,en--) cnt[i][j]++; } } } LL mx,mi,ans; mx=0; mi=k; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { mx=max(mx,cnt[i][j]); mi=min(mi,cnt[i][j]); } } printf("%lld %lld %lld ",mx,mi,cnt[x][y]); } return 0; }