2017 多校训练题解1 [K.KazaQ's Socks] 思考

题目链接:有编号1~n的n双袜子,每天穿一双编号最小的,晚上扔到洗衣机里。当只剩一双袜子时就要洗了,第二天晚上洗完的袜子回归。问第k天穿的是哪双。

关键思想:注意了,当没有开始洗的时候,每天穿的就依次是1、2、3、n,而穿编号n的袜子的晚上,脏袜子洗好了回归(编号为n的袜子扔到洗衣机里),现在能穿的只有1~n-1。

      依次穿1~n-2,然后穿n-1的时候,洗衣机里又有编号为1~n-2以及n一共n-1双袜子了又要开始洗。

      次日,n-1被扔到洗衣机里,1~n-2以及n这些袜子回归。

      依次穿1~n-2再穿n,最后一天晚上1~n-2和n-1这些袜子回归。

      依次穿1~n-2再穿n-1,最后一天晚上1~n-2以及n这些袜子回归。

      最后两步循环往复,因此有了以下代码

代码如下:

/*
CopyRight GentleGamer
*/
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    long long n,k;
    int cnt=1;
    long long ans=0;
    while(scanf("%ld%ld",&n,&k)){
        if(k<=n)ans=n;//k<=n是依次穿的。
        else {
            k-=n;//考查后面的循环情况
            long long tmp=k%(n-1);//我考虑的循环长度是n-1
            if(tmp>0)ans=tmp;//没穿到只剩一双的时候,是依次来的
            else{
                if((k/(n-1))&1){//如果在奇数个串里
                    ans=n-1;
                }else ans=n;
            }
        }
        printf("Case #%ld: %ld\n",cnt++,ans);
    }
    return 0;
}

 

posted @ 2017-07-25 18:31  哇咔咔咔  阅读(203)  评论(0编辑  收藏  举报