zoukankan      html  css  js  c++  java
  • 【codeforces 758C】Unfair Poll

    time limit per test1 second
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    On the Literature lesson Sergei noticed an awful injustice, it seems that some students are asked more often than others.

    Seating in the class looks like a rectangle, where n rows with m pupils in each.

    The teacher asks pupils in the following order: at first, she asks all pupils from the first row in the order of their seating, then she continues to ask pupils from the next row. If the teacher asked the last row, then the direction of the poll changes, it means that she asks the previous row. The order of asking the rows looks as follows: the 1-st row, the 2-nd row, …, the n - 1-st row, the n-th row, the n - 1-st row, …, the 2-nd row, the 1-st row, the 2-nd row, …

    The order of asking of pupils on the same row is always the same: the 1-st pupil, the 2-nd pupil, …, the m-th pupil.

    During the lesson the teacher managed to ask exactly k questions from pupils in order described above. Sergei seats on the x-th row, on the y-th place in the row. Sergei decided to prove to the teacher that pupils are asked irregularly, help him count three values:

    the maximum number of questions a particular pupil is asked,
    the minimum number of questions a particular pupil is asked,
    how many times the teacher asked Sergei.
    If there is only one row in the class, then the teacher always asks children from this row.

    Input
    The first and the only line contains five integers n, m, k, x and y (1 ≤ n, m ≤ 100, 1 ≤ k ≤ 1018, 1 ≤ x ≤ n, 1 ≤ y ≤ m).

    Output
    Print three integers:

    the maximum number of questions a particular pupil is asked,
    the minimum number of questions a particular pupil is asked,
    how many times the teacher asked Sergei.
    Examples
    input
    1 3 8 1 1
    output
    3 2 3
    input
    4 2 9 4 2
    output
    2 1 1
    input
    5 5 25 4 3
    output
    1 1 1
    input
    100 100 1000000000000000000 100 100
    output
    101010101010101 50505050505051 50505050505051
    Note
    The order of asking pupils in the first test:

    the pupil from the first row who seats at the first table, it means it is Sergei;
    the pupil from the first row who seats at the second table;
    the pupil from the first row who seats at the third table;
    the pupil from the first row who seats at the first table, it means it is Sergei;
    the pupil from the first row who seats at the second table;
    the pupil from the first row who seats at the third table;
    the pupil from the first row who seats at the first table, it means it is Sergei;
    the pupil from the first row who seats at the second table;
    The order of asking pupils in the second test:

    the pupil from the first row who seats at the first table;
    the pupil from the first row who seats at the second table;
    the pupil from the second row who seats at the first table;
    the pupil from the second row who seats at the second table;
    the pupil from the third row who seats at the first table;
    the pupil from the third row who seats at the second table;
    the pupil from the fourth row who seats at the first table;
    the pupil from the fourth row who seats at the second table, it means it is Sergei;
    the pupil from the third row who seats at the first table;

    【题目链接】:http://codeforces.com/contest/758/problem/C

    【题解】

    画一画;
    会发现;
    走完第一行之后;
    之后每2*(n-1)*m个格子为一个周期;
    这一个周期;
    固定把第一行和最后一行的格子每个格子递增1;
    同时第二行到第n-1行每个格子都递增2;
    我是以k<=n*m和k>n*m作为划分的;
    对于k<=n*m的情况直接暴力模拟(n*m最大为10000完全可以接受);
    对于k>n*m的情况
    先把第一行都加上1(先走完第一行);
    然后k-=m;
    周期的个数就为k/(2*(n-1)*m);
    然后对于剩下的k%(2*(n-1)*m)
    暴力搞完就好;
    特判一下n=1的情就好;
    不会很难的;
    到了n+1则变成n-1,转个方向;
    到了0则变成2,转个方向;

    【完整代码】

    #include <bits/stdc++.h>
    #define LL long long
    
    using namespace std;
    
    int x,y;
    LL n,m,k;
    LL a[110][110];
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        cin >> n >> m >> k >> x >> y;
        if (k<=n*m)
        {
            int rest = k;
            int nx = 1,ny = 1,fx=1;
            while (rest>0)
            {
                a[nx][ny]++;
                rest--;
                ny++;
                if (ny>m)
                {
                    ny = 1;
                    nx+=fx;
                }
                if (nx>n)
                {
                    nx-=2;
                    fx=-fx;
                }
                if (nx<1)
                {
                    nx = 2;
                    if (nx>n)
                        nx = 1;
                    fx=-fx;
                }
            }
        }
        else
        if (k > n*m)
        {
            if (n>1)
            {
                for (int i = 1;i <= m;i++)
                    a[1][i] = 1;
                LL temp,rest;
                k-=m;
                temp = k/(2*(n-1)*m);
                rest = k%(2*(n-1)*m);
                for (int i = 1;i <= m;i++)
                    a[1][i]+=temp,a[n][i]+=temp;
                for (int i = 2;i <= n-1;i++)
                    for (int j = 1;j <= m;j++)
                        a[i][j]+=temp*2;
                int nx = 2,ny = 1,fx=1;
                if (nx>n)
                    nx = 1;
                while (rest>0)
                {
                    a[nx][ny]++;
                    rest--;
                    ny++;
                    if (ny>m)
                    {
                        ny = 1;
                        nx+=fx;
                    }
                    if (nx>n)
                    {
                        nx-=2;
                        fx=-fx;
                    }
                    if (nx<1)
                    {
                        nx = 2;
                        fx = -fx;
                    }
                }
            }
            else
                if (n==1)
                {
                    LL temp = k/m;
                    LL rest = k%m;
                    for (int i = 1;i <= m;i++)
                        a[1][i]+=temp;
                    for (int i = 1;i <= rest;i++)
                        a[1][i]++;
                }
        }
        LL ma = a[1][1],mi = a[1][1];
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= m;j++)
            {
                ma = max(ma,a[i][j]);
                mi = min(mi,a[i][j]);
            }
        cout << ma << ' ' <<mi << ' '<<a[x][y]<<endl;
        return 0;
    }
  • 相关阅读:
    IsCallback和IsPostBack的区别
    win7 无Internet访问权限的解决方法
    Microsoft Office 2007的ContentType
    浏览器渲染原理
    css中hideFocus的用法
    js实现小球碰撞(数学之美)
    从浏览器的渲染原理讲CSS性能
    Jquery 常用方法经典总结
    web前端开发必备压缩工具整理
    15个精美PC/手机端自响应网页设计案例与欣赏
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626709.html
Copyright © 2011-2022 走看看