C. Unfair Poll-数数你会不会?

Codeforces Round #392 (Div. 2)
C. Unfair Poll
就是数数,先找周期,一个周期是这样的
1 2 3 …………………………………………..m
m+1, m+2, m+3 ………………………. 2m
2m+1, 2m+2, 2m+3……………………3m
………………………………………………………..
(n-2)m+1, (n-2)m+2…………………..(n-1)m
(n-1)m+1, (n-1)m+2,…………………..nm
((n-2)m+1, (n-2)m+2…………………..(n-1)m
………………………………………………………..
m+1, m+2, m+3 ………………………. 2m

然后再重复这样的周期,观察可以发现第一行和第n行的数一个周期只加1次,其余各行各数加2次,一个周期元素个数为T = n*m + (n-2)*m;(n!=1)或 T = 1(n=1)

先用k求出有多少个周期,最后剩下那部分直接模拟就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long int ll;
const int maxn = 105;
ll a[maxn * maxn];
int main()
{
//  freopen("in.txt","r",stdin);
    memset(a,0,sizeof(a));

    ll n,m,k,x,y,T;
    scanf("%lld %lld %lld %lld %lld",&n,&m,&k,&x,&y);
    if(n==1)T = m;
    else T = n*m + (n-2)*m;

    ll tot = n*m;
    ll maxv = 0,minv = k;   
    ll aver = k/T;
//  printf("%lld\n",aver);

    if(k >= T){
        for(ll i = 1;i<= m; ++i)  a[i] = aver;
        for(ll i = m+1;i<= (n-1)*m; ++i)  a[i] = 2*aver;
        for(ll i = (n-1)*m+1;i<= tot; ++i)  a[i] = aver;

        k = k - k/T*T;
    }
//  printf("%lld\n",k);

    if(k<=tot){
        for(ll i=1;i <= k;++i)++a[i];
    }   
    else{
        for(ll i=1;i <= tot ;++i)++a[i];
        k = k - tot;
        ll pos = (n-2)*m+1,cnt=0;
        while(k--){
            ++a[pos];
        //  printf("pos = %lld\n",pos);
            ++pos;
            ++cnt;
            if(cnt%m==0)pos=(n-2 - cnt/m)*m+1;
        }
    }   

    for(ll i=1;i<=tot;++i){
        if(maxv < a[i])maxv = a[i];
        if(minv > a[i])minv = a[i];
    }
/*  for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            printf("%lld: %lld    ",(i-1)*m+j,a[(i-1)*m+j]);
        }
        printf("\n");
    }
*/
    printf("%lld %lld %lld\n",maxv,minv,a[(x-1)*m+y]);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值