洛谷 AT_arc171_a [ARC171A] No Attacking 题解

发布于:2024-06-28 ⋅ 阅读:(9) ⋅ 点赞:(0)

分析

显然,在一个 N × N N\times N N×N 的网格里,如果要放超过 N N N 个车,那么是肯定无法完成的。

很明显,车放都在偶数行是最优的,如果不够了就放在奇数行,然后再把所有的兵都放在奇数行。

还可以知道,对于一个 N × N N\times N N×N 的方格,一共会有 ⌊ N 2 ⌋ \lfloor\frac{N}{2}\rfloor 2N 个偶数行, ⌈ N 2 ⌉ \lceil\frac{N}{2}\rceil 2N 个奇数行。

若:

  • A ≤ ⌊ N 2 ⌋ A\le\lfloor\frac{N}{2}\rfloor A2N:这时刚好所有的奇数行都不会被车吃到,但有 A A A 列会被车吃到,所以这时有 ⌈ N 2 ⌉ × ( N − A ) \lceil\frac{N}{2}\rceil\times (N-A) 2N×(NA) 个位置可以放兵。
  • A > ⌊ N 2 ⌋ A>\lfloor\frac{N}{2}\rfloor A>2N:由于偶数行只能放 ⌊ N 2 ⌋ \lfloor\frac{N}{2}\rfloor 2N 个车,所以这时会有 A − ⌊ N 2 ⌋ A-\lfloor\frac{N}{2}\rfloor A2N 个奇数行能被车吃到,故只有 ⌈ N 2 ⌉ − A + ⌊ N 2 ⌋ \lceil\frac{N}{2}\rceil-A+\lfloor\frac{N}{2}\rfloor 2NA+2N 行能够放兵,而由于有 A A A 列会被车吃到,所以只有 ( ⌈ N 2 ⌉ − A + ⌊ N 2 ⌋ ) × ( N − A ) (\lceil\frac{N}{2}\rceil-A+\lfloor\frac{N}{2}\rfloor)\times(N-A) (⌈2NA+2N⌋)×(NA) 个位置可以放兵。

然后再判断能不能放下 B B B 个车即可。

Code

#include<iostream>
#define ceil(n) (n%2?n/2+1:n/2)
using namespace std;
signed main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int t,n,a,b,sum;
	cin>>t;
	while(t--) {
		cin>>n>>a>>b;
		if(a>n) {
			cout<<"No\n";
			continue;
		}
		sum=(a<=n/2?ceil(n)*(n-a):(ceil(n)-a+n/2)*(n-a));//计算能放的兵的数量最多是多少
		if(b<=sum) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}