记录一个菜逼的成长。。
题目大意:
数数,从第1,…n排,再从第n-1,…,1排的顺序。问一个人被问最多和最少的次数和指定人的次数。
这题真的是xjb乱搞一通。。
特判只有一排和两排的。
以2*(n-1)*m为一轮
不满一轮的特判。
然后剩余k%2*(n-1)*m
暴力标记
最大的一定不在第一行和第n行。最小的一定在第n行。
不在第一行和第n行的每轮计算了两次,其他计算了一次。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn = 100 + 10;
LL num[maxn];
int vis[maxn][maxn];
int main()
{
LL n,m,k,x,y;
while(cin>>n>>m>>k>>x>>y){
LL mx = 0,mn = 1LL<<60,ans;
cl(num,0);
cl(vis,0);
if(n == 1){
int t = k % m;
LL mx = k / m,mn = k / m;
if(t)mx++;
LL ans;
if(y <= t)ans = mx;
else ans = mn;
printf("%I64d %I64d %I64d\n",mx,mn,ans);
continue;
}
LL c = k / (2*(n-1)*m);
k = k % (2*(n-1)*m);
if(n == 2){
if(!k){
mx = mn = c;
ans = c;
}
else {
mx = c + 1;
mn = c;
if((x-1)*m + y <= k)ans = mx;
else ans = mn;
}
printf("%I64d %I64d %I64d\n",mx,mn,ans);
continue;
}
num[1] = c;
num[2] = 2 * c;
for( int i = 1; i <= n && k; i++ ){
for( int j = 1; j <= m && k; j++ ){
vis[i][j]++;
k--;
}
}
for( int i = n-1; i >= 2 && k; i-- ){
for( int j = 1; j <= m && k; j++ ){
vis[i][j]++;
k--;
}
}
for( int i = 2; i < n; i++ ){
for( int j = 1; j <= m; j++ ){
mx = max(mx,(LL)vis[i][j]);
}
}
if(!c){
for( int i = 1; i <= n; i++ ){
for( int j = 1; j <= m; j++ ){
mx = max(mx,(LL)vis[i][j]);
mn = min(mn,(LL)vis[i][j]);
}
}
printf("%I64d %I64d %I64d\n",mx,mn,(LL)vis[x][y]);
continue;
}
for( int i = 1; i <= m; i++ )mn = min(mn,(LL)vis[1][i]);
for( int i = 1; i <= m; i++ )mn = min(mn,(LL)vis[n][i]);
ans = vis[x][y];
mx += num[2];
mn += num[1];
if(x > 1 && x < n)ans += num[2];
else ans += num[1];
printf("%I64d %I64d %I64d\n",mx,mn,ans);
}
return 0;
}