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

Codeforces 758C Unfair Poll

2017-01-20 14:08 232 查看
题目链接:http://codeforces.com/contest/758/problem/C

题意:不公平的点名,给定一个教室,然后老师按照一定规则点名,行数从1点到n,再回到 1,列数一直从1到m 。求点名最多的学生的次数,和最少的,和一定位置的点名次数。

分析:

不太擅长计数,直接模拟一个二维矩阵好了,由于从前往后和从后往前是不一样的,直接建一个数组记录从前往后+从后往前,其中数据类型为pair<int ,int> 型。

#include <bits/stdc++.h>

using namespace std;

long long a[110][110];
vector<pair<int,int> > V;

int main()
{
int n,m,x,y;
unsigned long long k;
cin>>n>>m>>k>>x>>y;

if(n==1)
{
for(int i=0; i<m; i++)
{
V.push_back(make_pair(1,i+1));
}
}
else
{
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
V.push_back(make_pair(i+1,j+1));
}
}
for(int i=n-1; i>1; i--)
{
for(int j=0; j<m; j++)
V.push_back(make_pair(i,j+1));
}
}

int T = V.size();
unsigned long long p = k / T;

for(int i=0; i<T; i++)
{
a[V[i].first][V[i].second] +=p;
}

k = k%T;
for(unsigned long long i=0; i<k; i++)
{
a[V[i].first][V[i].second]++;
}

long long mn = 1LL << 60, mx = 0;
for(int i=1 ; i <= n ; ++ i)
{
for (int j = 1 ; j <= m ; ++ j)
{
mn = min(mn, a[i][j]);
mx = max(mx, a[i][j]);
}
}
cout << mx << ' ' << mn << ' ' << a[x][y] << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: