时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
把Noland抽象成一个n∗m的方格矩阵,行从上到下为1∼n,列从左到右为1∼m。codeJan处在坐标为(R,C)方格上,codeJan可以观察到他所在的行和列的治安情况。有一个恐怖分子想要毁掉Noland,又不被codeJan观察到。恐怖分子手中有无穷多个可以每次炸毁边长为K∗K的区域。方格矩阵的每个方格的边长为1。炸毁的区域不能超过Noland(方格矩阵)的范围,同一块区域可以炸毁多次。恐怖分子至少需要多少颗炸弹才能炸毁除了codeJan所在的行列的其余所有区域?或者无法完成这个任务?
输入描述:
第一行是一个 T(T ≤ 1000) 代表测试组数。接下来 T 行,每行包含 5 个正整数 n, m,R, C,K,含义如上。
输出描述:
一共输出 T 行,每行输出一个数字。如果可以完成任务,输出需要的最少的炸弹数量;否则无法完成任务,输出 -1。
示例1
输入
3 1 1 1 1 1 2 2 1 1 1 3 3 2 2 1
输出
0 1 4
说明
第一个样例,因为只有一个格子且被警察占领,所以不需要额外炸掉格子,所以答案是 0。 第二个样例,只需要炸掉 (2,2) 这个格子,所以需要 1 颗可以炸毁 1*1 的炸弹。 第三个样例,有四个格子需要炸毁,所以需要 4 颗 1*1 的炸弹。
备注:
1 ≤ n, m,K ≤ 2*106, 1 ≤ R ≤ n, 1 ≤ C ≤ m。
思路:分四种情况。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#define inf 0x7f7f7f7f
#define maxn 2000005
#define ll long long
using namespace std;
//string s[maxn];
int main(){
int t;
int n,m,R,C,k;
cin>>t;
while(t--){
cin>>n>>m>>R>>C>>k;
if((m-C<k&&C!=m)||(C-1<k&&C!=1)||(n-R<k&&n!=R)||(R-1<k&&R!=1)) {
cout<<"-1"<<endl;
continue;
}
ll ans,ans1;
ll sum=0;
if((C-1)%k==0){
ans=(C-1)/k;
}
else{
ans=(C-1)/k+1;
}
if((R-1)%k==0){
ans1=(R-1)/k;
}
else {
ans1=(R-1)/k+1;
}
// cout<<ans<<" "<<ans1<<endl;
sum+=ans*ans1;
if((m-C)%k==0){
ans=(m-C)/k;
}
else{
ans=(m-C)/k+1;
}
if((R-1)%k==0){
ans1=(R-1)/k;
}
else {
ans1=(R-1)/k+1;
}
// cout<<ans<<" "<<ans1<<endl;
sum+=ans*ans1;
if((n-R)%k==0){
ans=(n-R)/k;
}
else{
ans=(n-R)/k+1;
}
if((C-1)%k==0){
ans1=(C-1)/k;
}
else{
ans1=(C-1)/k+1;
}
// cout<<ans<<" "<<ans1<<endl;
sum+=ans*ans1;
if((n-R)%k==0){
ans=(n-R)/k;
}
else{
ans=(n-R)/k+1;
}
if((m-C)%k==0){
ans1=(m-C)/k;
}
else{
ans1=(m-C)/k+1;
}
// cout<<ans<<" "<<ans1<<endl;
sum+=ans*ans1;
cout<<sum<<endl;
}
return 0;
}