题解 P2180 【摆石子】
基础计数类、基础数学思维类好题。
一看这
首先,如果面对下面一种情况(一个
要再放一个石子进去,应该如何放?当然要补在缺口处。这样新放上去的石子就可以和9个位置的石子组成矩形,然而放在别的位置都不能。(证明略)
所以结论就是:将石子阵摆成接近矩形,只有一个缺口的时候最优。
一个矩形石子阵
就是说有两次求和个矩形右下角可以选择,每一个右下角有
化简一下:
好了,那就用类似二维前缀和的方法计算一个不是矩形的石子阵就好了。
注意
最后要做的就是枚举不完全矩阵的长度,分别计算。
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int main(){
int maxn=0;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
if(k/i>=m)continue;
int len=k/i;
int mod=k%i;
maxn=max(maxn,(i*(i-1)/2*len*(len-1)/2+(len+1)*len/2*mod*(mod-1)/2-(len*(len-1)/2*mod*(mod-1)/2)));
}
for(int i=1;i<=m;i++){
if(k/i>=n)continue;
int len=k/i;
int mod=k%i;
maxn=max(maxn,(i*(i-1)/2*len*(len-1)/2+(len+1)*len/2*mod*(mod-1)/2-(len*(len-1)/2*mod*(mod-1)/2)));
}
cout<<maxn<<endl;
return 0;
}