注:本文为洛谷用户 zhangsenhao6728(也就是我)的题解,已提交成功。
解题思路
又是一道思维性较强的题目。
本题的关键点就是求出怎样放才能达到最好的效果。
现在让我来告诉你,一排一排的或一列一列的按顺序放是最优解。
我们先模拟一下 n = 4 , m = 5 n=4,m=5 n=4,m=5 的解题过程:
第一种,一排一排的放,每次放置的得分如下:
0 0 0 | 1 1 1 | 1 1 1 | 1 1 1 | 1 1 1 |
---|---|---|---|---|
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 2 2 2 |
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 2 2 2 |
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 3 3 3 |
通过分析表格,我们得知:一排一排的放最大的得分为: ( n − 1 ) × ( m − 1 ) × 2 + ( n − 1 + m − 1 ) + 1 = 2 m n − n − m + 1 (n-1)\times(m-1)\times2+(n-1+m-1)+1=2mn-n-m+1 (n−1)×(m−1)×2+(n−1+m−1)+1=2mn−n−m+1。
第二种,一列一列的放,每次放置的得分如下:
0 0 0 | 1 1 1 | 1 1 1 | 1 1 1 | 1 1 1 |
---|---|---|---|---|
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 2 2 2 |
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 2 2 2 |
1 1 1 | 2 2 2 | 2 2 2 | 2 2 2 | 3 3 3 |
通过分析表格,我们得知:一列一列的放最大的得分为: ( n − 1 ) × ( m − 1 ) × 2 + ( n − 1 + m − 1 ) + 1 = 2 m n − n − m + 1 (n-1)\times(m-1)\times2+(n-1+m-1)+1=2mn-n-m+1 (n−1)×(m−1)×2+(n−1+m−1)+1=2mn−n−m+1。
然后,一细看,耶?这不是一样的吗?所以最终只要输出 2 m n − n − m + 1 2mn-n-m+1 2mn−n−m+1 即可。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n,m;
cin>>n>>m;
long long ans=2*n*m-n-m;
cout<<ans<<endl;
}
return 0;
}