假设老师从第一行叫到最后一行或者从最后一行叫到第一行是一轮,可以得到式子m(nq-q+1)<=k,由此可以推出q(轮数)的最大值。
剩余的叫的次数就可以暴力了。
#include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll K; int n,m,x,y; ll ci[110]; int a[110][110]; int main() { // freopen("c.in","r",stdin); scanf("%d%d%I64d%d%d",&n,&m,&K,&x,&y); if(n==1) { if(K%(ll)m==0) printf("%I64d %I64d %I64d ",K/(ll)m,K/(ll)m,K/(ll)m); else printf("%I64d %I64d %I64d ",K/(ll)m+1ll,K/(ll)m,(ll)y<=K%(ll)m ? K/(ll)m+1ll : K/(ll)m); return 0; } ll q=(K-(ll)m)/(ll)(m*(n-1)); ll _n=q/2ll; ll _1=(q-1)/2ll; for(int i=2;i<n;++i) ci[i]=q; ci[1]=q-_1; ci[n]=q-_n; int nowx; if(q%2==1) nowx=n-1; else nowx=2; int nowy=1; bool flag; if(q%2==1) flag=1; else flag=0; if(q==0) nowx=1; for(ll i=(q==0 ? 1ll : (ll)m*((ll)n*q-q+1ll)+1ll);i<=K;++i) { ++a[nowx][nowy]; if(nowy!=m) ++nowy; else { nowy=1; if(nowx==n) { nowx=n-1; flag=1; } else if(nowx==1) { nowx=2; flag=0; } else { if(flag) --nowx; else ++nowx; } } } ll maxv=0,minv=1000000000000000001ll; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { maxv=max(maxv,ci[i]+(ll)a[i][j]); minv=min(minv,ci[i]+(ll)a[i][j]); } printf("%I64d %I64d %I64d ",maxv,minv,ci[x]+(ll)a[x][y]); return 0; }