题目描述
把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。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,m,r,c,k;
int t;
cin>>t;
while(t--)
{
long long h1,h2,h3,h4,s1,s2,s3,s4;
scanf("%d%d%d%d%d",&n,&m,&r,&c,&k);
h1=h2=r-1;
h3=h4=n-r;
s1=s3=c-1;
s2=s4=m-c;
if(((s1<k||h1<k)&&s1*h1)||((s2<k||h2<k)&&s2*h2)||((s3<k||h3<k)&&s3*h3)||((s4<k||h4<k)&&s4*h4)){printf("-1\n");continue;}
long long sum=0;
if(h1%k==0)h1=h1/k;
else h1=h1/k+1;
if(s1%k==0)s1=s1/k;
else s1=s1/k+1;
if(h2%k==0)h2=h2/k;
else h2=h2/k+1;
if(s2%k==0)s2=s2/k;
else s2=s2/k+1;
if(h3%k==0)h3=h3/k;
else h3=h3/k+1;
if(s3%k==0)s3=s3/k;
else s3=s3/k+1;
if(h4%k==0)h4=h4/k;
else h4=h4/k+1;
if(s4%k==0)s4=s4/k;
else s4=s4/k+1;
printf("%lld\n",h1*s1+h2*s2+h3*s3+h4*s4);
}
return 0;
}
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,m,r,c,k;
int t;
cin>>t;
while(t--)
{
long long h1,h2,h3,h4,s1,s2,s3,s4;
scanf("%d%d%d%d%d",&n,&m,&r,&c,&k);
h1=h2=r-1;
h3=h4=n-r;
s1=s3=c-1;
s2=s4=m-c;
if(((s1<k||h1<k)&&s1*h1)||((s2<k||h2<k)&&s2*h2)||((s3<k||h3<k)&&s3*h3)||((s4<k||h4<k)&&s4*h4)){printf("-1\n");continue;}
long long sum=0;
if(h1%k==0)h1=h1/k;
else h1=h1/k+1;
if(s1%k==0)s1=s1/k;
else s1=s1/k+1;
if(h2%k==0)h2=h2/k;
else h2=h2/k+1;
if(s2%k==0)s2=s2/k;
else s2=s2/k+1;
if(h3%k==0)h3=h3/k;
else h3=h3/k+1;
if(s3%k==0)s3=s3/k;
else s3=s3/k+1;
if(h4%k==0)h4=h4/k;
else h4=h4/k+1;
if(s4%k==0)s4=s4/k;
else s4=s4/k+1;
printf("%lld\n",h1*s1+h2*s2+h3*s3+h4*s4);
}
return 0;
}