您的位置:首页 > 大数据 > 人工智能

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

2017-02-01 01:46 344 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces