Codeforces 758C Unfair Poll
部分转自https://www.cnblogs.com/TreeDream/p/6322699.html
题目链接:http://codeforces.com/contest/758/problem/C
题意:不公平的点名,给定一个教室,然后老师按照一定规则点名,行数从1点到n,再回到 1,列数一直从1到m 。求点名最多的学生的次数,和最少的,和一定位置的点名次数。
分析:
不太擅长计数,直接模拟一个二维矩阵好了,由于从前往后和从后往前是不一样的,直接建一个数组记录从前往后+从后往前,其中数据类型为pair<int ,int> 型。
#include<stdio.h>
#include<iostream>
#include<vector>
#define ll long long
using namespace std;
vector<pair<int,int> >v;
int main ()
{
int n,m,x,y;
ll k;
while(~scanf("%d%d%lld%d%d",&n,&m,&k,&x,&y))
{v.clear();
ll a[102][103]={0};
long long maxnum=-1;
long long minnum=1000000000000000000;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++){
v.push_back(make_pair(i,j));
}
}
for(int i=n-1;i>1;i--){
for(int j=1;j<=m;j++){
v.push_back(make_pair(i,j));
}
}
int siz=v.size();
ll jie=k/(ll)siz;
for(int i=0;i<siz;i++){
a[v[i].first][v[i].second]+=jie;
}
ll yu=k%((ll)siz);
for(ll i=0;i<yu;i++){
a[v[i].first][v[i].second]++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
maxnum=max(maxnum,a[i][j]);
minnum=min(minnum,a[i][j]);
}
}
printf("%lld %lld %lld\n",maxnum,minnum,a[x][y]);
}
}