HDU 6043 穿袜子找规律

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6043

题意:有n双袜子,编号1到n,放在衣柜里,每天早晨取衣柜中编号最小的袜子穿,晚上将这双袜子放在篮子里,当篮子里有n-1双袜子时,清洗袜子,直到第二天晚上才洗好,并将洗好的袜子重新放回衣柜。

1、n=2时,1 2 1 2 1 2 1 2……

2、n=3时,1 2 3 1 2 1 3 1 2 1 3……

3、n=4时,1 2 3 4 1 2 3 1 2 4 1 2 3 1 2 4……

4、n=5时,1 2 3 4 5 1 2 3 4 1 2 3 5 1 2 3 4 1 2 3 5……分析:找规律。

比如,输入的用例:3 7
每天穿的袜子编号:1 2 3 1 2 1 3 1 2 1 3
其中发现:1 2 3 之后的都是 1 2 、 1 3 , 也就是说在穿第 2/3 双袜子的那一天才洗袜子。
又比如: 4 9
每天穿的袜子编号: 1 2 3 4 1 2 3 1 2 4 1 2 3
其中又发现:1 2 3 4 之后的都是 1 2 3 、 1 2 4,也就是说在穿第 3/4 双袜子的那一天才洗袜子。

 解决:
1、当 day <= numOfSocks 时,直接输出 day
2、当 day > numOfSocks 时,分以下两种情况:
 ①、当 (day-numOfSocks) % (numOfSocks-1) == 0 时,
 i、(day-numOfSocks)/(numOfSocks-1) == 偶数时,输出 numOfSocks
 ii、(day-numOfSocks)/(numOfSocks-1) == 奇数时,输出 numOfSocks-1
②、否则输出 (day-numOfSocks) % (numOfSocks-1).

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
using namespace std;
int main()
{
    LL n, k;
    int kase = 0;
    while(scanf("%lld%lld", &n, &k) == 2)
    {
        printf("Case #%d: ", ++kase);
        if(k <= n)
        {
            printf("%lld
", k);
            continue;
        }
        LL a = (k - n) / (n - 1);
        LL b = (k - n) % (n - 1);
        if(b != 0)
        {
            printf("%lld
", b);
        }
        else
        {
            if(a & 1)
            {
                printf("%lld
", n - 1);
            }
            else
            {
                printf("%lld
", n);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingzhao/p/7240964.html