题目链接:http://codeforces.com/contest/758/problem/C
题意:不公平的点名,给定一个教室,然后老师按照一定规则点名,行数从1点到n,再回到 1,列数一直从1到m 。求点名最多的学生的次数,和最少的,和一定位置的点名次数。
分析:
不太擅长计数,直接模拟一个二维矩阵好了,由于从前往后和从后往前是不一样的,直接建一个数组记录从前往后+从后往前,其中数据类型为pair<int ,int> 型。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 long long a[110][110]; 6 vector<pair<int,int> > V; 7 8 int main() 9 { 10 int n,m,x,y; 11 unsigned long long k; 12 cin>>n>>m>>k>>x>>y; 13 14 if(n==1) 15 { 16 for(int i=0; i<m; i++) 17 { 18 V.push_back(make_pair(1,i+1)); 19 } 20 } 21 else 22 { 23 for(int i=0; i<n; i++) 24 { 25 for(int j=0; j<m; j++) 26 { 27 V.push_back(make_pair(i+1,j+1)); 28 } 29 } 30 for(int i=n-1; i>1; i--) 31 { 32 for(int j=0; j<m; j++) 33 V.push_back(make_pair(i,j+1)); 34 } 35 } 36 37 38 int T = V.size(); 39 unsigned long long p = k / T; 40 41 for(int i=0; i<T; i++) 42 { 43 a[V[i].first][V[i].second] +=p; 44 } 45 46 k = k%T; 47 for(unsigned long long i=0; i<k; i++) 48 { 49 a[V[i].first][V[i].second]++; 50 } 51 52 long long mn = 1LL << 60, mx = 0; 53 for(int i=1 ; i <= n ; ++ i) 54 { 55 for (int j = 1 ; j <= m ; ++ j) 56 { 57 mn = min(mn, a[i][j]); 58 mx = max(mx, a[i][j]); 59 } 60 } 61 cout << mx << ' ' << mn << ' ' << a[x][y] << endl; 62 63 return 0; 64 }