No Attacking(禁止攻击)
时间限制:2s 内存限制:1024MB
【原题地址】
所有图片源自Atcoder,题目译文源自脚本Atcoder Better!
【问题描述】
【输入格式】
每个测试用例的格式如下:
【输出格式】
【样例1】
【样例输入1】
8
5 2 3
6 5 8
3 2 2
11 67 40
26 22 16
95 91 31
80 46 56
998 2 44353
【样例输出1】
Yes
No
No
No
Yes
No
Yes
Yes
【样例说明1】
【解题思路】
老汉使用到的是XXX的解题方式
本题是求能否将所有棋子都放置进棋盘。
我们可以把该题看作为,放置所有车后的余下面积是否允许放置所有的卒,车的最佳摆放为先在矩形中的偶数行放置,不够放置时再往奇数行放置,求出余下的的面积,判断卒能否全部放置其中。
代码注释有详细过程
【代码】
package ARC171_A_NoAttacking;
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static StreamTokenizer st = new StreamTokenizer(br);
public static int readInt() throws IOException {
st.nextToken();
return (int) st.nval;
}
public static void main(String[] args) throws IOException {
int T = readInt();
while (T-- > 0) {
int N = readInt();
int A = readInt();
int B = readInt();
if (isPossible(N, A, B)) {
pw.println("Yes");
} else {
pw.println("No");
}
}
pw.flush();
pw.close();
br.close();
}
/**
* 判断是否符合题目条件
*
* @param N
* @param A
* @param B
* @return true or false
*/
private static boolean isPossible(int N, int A, int B) {
// 有效区域为放置所有车后,允许放置卒的最大数
// 将N改为有效宽(有效区域宽只受车影响)
N -= A;
// 当有效宽度小于0时,必然不符合题目条件
if (N < 0)
return false;
// 车偶数行放置,与之相邻余下奇数行的行数
int a = Math.min(N, A + 1);
// 放置完车与对应的卒后,剩下的行数,可放置卒的行数为剩下行数的一半
int b = (N - a) / 2;
// 求出有效区域的面积,判断是否能容纳所有卒
B -= (a + b) * N;
return B <= 0;
}
}