codeforces 758C
Posted malcolmmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 758C相关的知识,希望对你有一定的参考价值。
codeforces 758C
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];
}
以上是关于codeforces 758C的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段