codeforces 758C

codeforces 758C

C. Unfair Poll

introduction

一个矩形方格,从前到后,再从后到前数k次,问每个方格最多/最少经过多少次,(x,y)方格上经过多少次

method

遍历是有周期的,一个周期经过2(n-1)m个方格,当n=1时,周期为m
先求出周期,再求出剩下的次数,然后将剩下的次数,通过遍历分配到每一个方格上

tips

o(1)解决问题比较困难的时候,可以向o(n)求助

Q&A

conclusion

  • 想到了周期性,但是没有处理好外层循环和内层循环的关系,
  • 另外周期的起点确定也很有技巧,
  • 用公式确定次数比较复杂,用枚举的方法可以化繁为简

reference

http://codeforces.com/blog/entry/49880
http://codeforces.com/problemset/submission/758/47274112

code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#include<istream>
#include<cassert>
#include<set>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
using namespace std;
typedef long long ll;
int main()
{
//    freopen("in.txt","r",stdin);
    ll n, m, k, x,y;
    cin>>n>>m>>k>>x>>y;
    ll trn;
    trn=n==1?m:2*(n-1)*m;
    ll mmx,mmn,srg;
    ll tms=k/trn;
    ll lft=k%trn;
    ll cnt[110][110];
    for(int ii=1;ii<=n ;ii++ ){
        for(int jj=1;jj<=m ;jj++ ){
            if(ii==1||ii==n)cnt[ii][jj]=tms;
            else cnt[ii][jj]=tms*2;
        }
    }
    ///对lft进行分配
    for(int ii=1;ii<=n ;ii++ ){
        for(int jj=1;jj<=m ;jj++ ){
            if(lft){
                cnt[ii][jj]++;
                lft--;
            }
        }
    }
    for(int ii=n-1;ii>=1 ;ii-- ){
        for(int jj=1;jj<=m ;jj++ ){
            if(lft){
                cnt[ii][jj]++;
                lft--;
            }
        }
    }
    mmx=max(cnt[1][1],max(cnt[2][1],cnt[n-1][1]));
    mmn=cnt[n][m];
    cout<<mmx<<" "<<mmn<<" "<<cnt[x][y];
}

原文地址:https://www.cnblogs.com/MalcolmMeng/p/10234806.html