题意:
老师按顺序点名,询问提问次数最多,最少的和x,y位置的学生被提问的次数
思路:
每次以m(2n-2)为一轮,开始二分枚举。之后剩下的暴力枚举
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ll;
ll mp[105][105];
int main()
{
ll n,m,k,x,y;
cin>>n>>m>>k>>x>>y;
ll mid,ans;
ll l=0,r=k/n;
ll turn=(n-1)*2*m;
if(n==1)
{
turn=m;
ans= k/turn;
}
else
while(l<=r)
{
mid=(l+r)>>1;
if( mid*turn>k )
r=mid-1;
else
ans=mid,l=mid+1;
}
k=k-ans*turn;
for(int i=1; i<=n ;i++)
{
for(int j=1; j<=m;j++)
{
mp[i][j]+=ans;
}
}
for(int i=n-1;i>1;i--)
{
for(int j=1;j<=m;j++)
{
mp[i][j]+=ans;
}
}
for(int i=1;k&&i<=n ;i++)
for(int j=1;k&&j<=m;j++)
k--,mp[i][j]++;
for(int i=n-1;k&&i>1;i--)
for(int j=1;k&&j<=m;j++)
k--,mp[i][j]++;
ll minn=1e18,maxx=0,res=0;
res=mp[x][y];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
maxx=max(mp[i][j],maxx);
minn=min(mp[i][j],minn);
}
}
cout<<maxx << " "<< minn <<" "<<res<<endl;
}