codeforces 758 C

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;
}
原文地址:https://www.cnblogs.com/cherryMJY/p/6428643.html