• 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;
    }
    
  • 相关阅读:
    元数据 缓存 池 模式
    ContractPattern 面向面向契约模式
    第三方登录 ----转载自简书,作者 <<碧霄问鼎>>
    证书那些事
    导航(NavanavigationController)push和pop
    iOS app上传错误集锦(转载)
    Block 的基本用法
    正则表达式的用法 转载
    UIView
    UIDate(时间)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7238751.html
Copyright © 2020-2023  润新知