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;
}

 

转载于:https://www.cnblogs.com/G-M-WuJieMatrix/p/7235808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值