传送门: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; }