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;
    }
    
  • 相关阅读:
    MARKY一下。
    从一个git仓库拷贝到另一个git仓库
    Git:四、连接GitHub远程仓库
    木门工厂木门、门套、套线公式和算法
    设计模式之代理模式
    2018年软件开发状态报告
    产品研发流程与周期(非原创)
    软件工程师的核心竞争力
    linux下安装redis安装使用
    8 个 Tips 让你更好的进行 Code Review
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7238751.html
Copyright © 2011-2022 走看看