L1-071 前世档案 - java

题目解析

针对每组回答 求出每组回答得到的结论

解题思路

找规律 ...

对于每个回答 我们都有 是和否 两种回答
然后对于这样子的性质 可以联想到二进制

如图 当前的所有结论为 8
也就是 1 << 3

可是二进制对于这个来说好像又不怎么对

  • 1: 将 yy看为11nn看为00。 然后 ynyyny 也就是 101101 转化为十进制 是 55
  • 2: 将 yy看为00nn看为11。 然后 ynyyny 也就是 010010 转化为十进制 是 22
  • 可是答案 ynyyny33 也对不上

可是转念一想,如果不单单只有转换呢? 再加上点呢?

  • 如果选择 方案1呢 , 那么就可以推出 85=38 - 5 = 3

    看看 nyy=(011)2=(3)10nyy = (011)_{2} = (3)_{10}, 然后 83=58 - 3 = 5 也对上了

    再看看其他的 也对的上

  • 如果选择 方案2呢, 2+1=32 + 1 = 3 才对的上 用总方案数的话 就很难推出答案

    看看 nyy=(100)2=(4)10nyy = (100)_{2} = (4)_{10} , 然后 4+1=54 + 1 = 5 也对上了

    再看看其他的 也是对上的

所以 两种方案都行 只不过需要再加上一点

设 将给定回答转化为二进制之后为 x

  • 如果 选择方案1 将 yy看为11, nn看为00。 那么式子就是 1<<n(x)101 << n - (x)_{10}
  • 如果 选择方案2 将 yy看为00, nn看为11。 那么式子就是 (x)10+1(x)_{10} + 1

代码

方案1

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt();
		int m = sc.nextInt();
		while (m-- > 0)
		{
			String str = sc.next().replace("y", "1").replace("n", "0");
			out.println((1 << n) - Integer.valueOf(str, 2));
		}

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}


方案2

import java.io.*;
import java.math.*;
import java.util.*;

public class Main
{

	public static void main(String[] args)
	{
		int n = sc.nextInt();
		int m = sc.nextInt();
		while (m-- > 0)
		{
			String str = sc.next().replace("y", "0").replace("n", "1");
			out.println(Integer.valueOf(str, 2) + 1);
		}

		out.flush();
		out.close();
	}

	static Scanner sc = new Scanner(System.in);
	static PrintWriter out = new PrintWriter(System.out);
}


团体程序设计天梯赛-练习集-java

赞赏