HDU 6043(KazaQ's Socks) 规律题 Java

2017 Multi-University Training Contest - Team 1 1011题

找规律,分情况!!!

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Scanner;

/**
 * 题意:有 numOfSocks 双袜子序号分别为 1~numOfSocks,每天早上穿序号最小的那双,每天晚上放到篮子里,
 *      当穿最后一双袜子的时候,会洗篮子里面的袜子(当天就干),问第 day 天穿的哪双袜子。
 * 
 * 分析:找规律。
 *      比如,输入的用例: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 双袜子的那一天才洗袜子。
 *  也就能说明了只有在穿第 numOfSocks/numOfSocks-1 双袜子的那一天,才洗袜子。
 *  更进一步说明:numOfSocks 和 numOfSocks-1 是轮流来的。
 * 
 * 解决:
 *  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).
 * 
 * @author TinyDolphin
 *
 */
public class Main {

    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        BigInteger numOfSocks;
        BigInteger day;
        int count = 0;
        while (in.hasNext()) {
            numOfSocks = in.nextBigInteger();
            day = in.nextBigInteger();
            out.print("Case #" + (++count) + ": ");
            if (day.compareTo(numOfSocks) <= 0) {
                out.println(day);
            } else {
                if ((day.subtract(numOfSocks)).mod(numOfSocks.subtract(BigInteger.valueOf(1)))
                        .compareTo(BigInteger.valueOf(0)) != 0) {
                    out.println((day.subtract(numOfSocks)).mod(numOfSocks.subtract(BigInteger.valueOf(1))));
                } else {
                    if ((day.subtract(numOfSocks)).divide(numOfSocks.subtract(BigInteger.valueOf(1)))
                            .mod(BigInteger.valueOf(2)).compareTo(BigInteger.valueOf(0)) == 0) {
                        out.println(numOfSocks);
                    } else {
                        out.println(numOfSocks.subtract(BigInteger.valueOf(1)));
                    }
                }
            }
        }
        out.flush();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值