Codeforces 758C Unfair Poll

题目链接: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 }
原文地址:https://www.cnblogs.com/TreeDream/p/6322699.html