zoukankan      html  css  js  c++  java
  • 2017ACM暑期多校联合训练

    题目链接

    Problem Description

    KazaQ wears socks everyday.

    At the beginning, he has n pairs of socks numbered from 1 to n in his closets.

    Every morning, he puts on a pair of socks which has the smallest number in the closets.

    Every evening, he puts this pair of socks in the basket. If there are n−1 pairs of socks in the basket now, lazy KazaQ has to wash them. These socks will be put in the closets again in tomorrow evening.

    KazaQ would like to know which pair of socks he should wear on the k-th day.

    Input
    The input consists of multiple test cases. (about 2000)

    For each case, there is a line contains two numbers n,k (2≤n≤109,1≤k≤1018).

    Output
    For each test case, output "Case #x: y" in one line (without quotes), where x indicates the case number starting from 1 and y denotes the answer of corresponding case.

    Sample Input
    3 7
    3 6
    4 9

    Sample Output
    Case #1: 3
    Case #2: 1
    Case #3: 2

    分析:
    有n双袜子分别编号1~n,每天从干净的袜子中选择一双编号最小的袜子穿,如果干净的袜子只剩下一双了,就把所有穿过的袜子洗干净接着穿,选择的时候仍然满足上面的规则,问第k天穿的袜子的编号是多少?

    这就是一个找规律的题,我们通过两组数据来看一下他的规律:
    数据1: 3 7
    那每天穿的袜子的序列就是:
    1 2 3 1 2 1 3 那么第七天穿的袜子就是编号3,
    如果我们接着往下看的话,就会发现整个序列是这样子的:
    1 2 3 1 2 1 3 1 2 1 3 1 2 1 3······
    就会发现除了前n天以外,穿的袜子的编号的循环节是 1 2 1 3。

    数据2: 4 9
    那每天穿的袜子的序列就是:
    1 2 3 4 1 2 3 1 2 那么第七天穿的袜子就是编号2,
    如果我们接着往下看的话,就会发现整个序列是这样子的:
    1 2 3 4 1 2 3 1 2 4 1 2 3 1 2 4 1 2 3 1 2 4 ······
    就会发现除了前n天以外,穿的袜子的编号的循环节是 1 2 3 1 2 4。

    通过上面的两组数据我们就可以发现他的循环规律:
    我们将每个循环节的前半部分和后半部分分开,会发现最后一位是在n和n-1直接,前面的就是第几次去袜子对于(n-1)的一个余数。

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main()
    {
        long long int n,k,Case=1;
        {
            while(~scanf("%lld%lld",&n,&k))
            {
                printf("Case #%lld: ",Case++);
                if(k<=n)                 ///直接输出来就行了
                    printf("%lld
    ",k);
                else
                {
                    long long int num=(k-n)/(n-1);///num表示第几次取半循环
                    long long int yu=(k-n)%(n-1);///yu表示在半循环中取第几个
                    if(num%2==0)///偶数次
                    {
                        if(yu==0)///最后一个
                            printf("%lld
    ",n);
                        else
                            printf("%lld
    ",yu);
                    }
                    else///奇数次
                    {
                       if(yu==0)///最后一个
                            printf("%lld
    ",n-1);
                        else
                            printf("%lld
    ",yu);
                    }
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    CSS filter属性
    css过渡的使用
    关于2D、3D的转换
    3D立体旋转
    css的规范命名
    html标签的简单总结
    css之简单动画
    几种动态的学习链接
    css之规范命名
    css
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7238751.html
Copyright © 2011-2022 走看看