NC14843. 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。C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2020-07-25 16:05:47
#include<bits/stdc++.h> using namespace std; #define ll long long int t,n,m,r,c,k; ll ask(int n,int m){ if(!n||!m)return 0; if(n<k||m<k)return -1LL<<60; return (ll)(n+k-1)/k*((m+k-1)/k); } int main(){ scanf("%d",&t); while(t--){ scanf("%d%d%d%d%d",&n,&m,&r,&c,&k); cout<<max(ask(r-1,c-1)+ask(n-r,c-1)+ask(r-1,m-c)+ask(n-r,m-c),-1LL)<<endl; } return 0; }
C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2020-11-09 01:29:33
#include<bits/stdc++.h> using namespace std; #define ll long long int t,n,m,r,c,k; ll ask(int n,int m) { if(!n||!m)return 0; if(n<k||m<k)return -1LL<<60; return (ll)(n+k-1)/k*((m+k-1)/k); } int main() { scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d",&n,&m,&r,&c,&k); cout<<max(ask(r-1,c-1)+ask(n-r,c-1)+ask(r-1,m-c)+ask(n-r,m-c),-1LL)<<endl; } return 0; }