10.21T1 数学

Description

  小B和小S准备参加学校最火爆的围棋社。作为资格考试,社长给他们出了一道题:给出一个有n条水平线与m条竖直线构成的棋盘(并不一定是传统围棋棋盘的19条线),然后他们有k枚棋子可以摆放到棋盘上的网格的交叉点上。我们定义一个方案的“赢面”为棋盘上四边与棋盘上的直线重合且四个角上都有棋子的矩形个数。小B和小S当然要尽量选出“赢面”最大的方案。不过他们还要学求导,背元素周期表,刷物理必刷题......所以他们向你求助。如果你成功帮助他们,就会得到巴蜀无限饭卡。

Input

  输入一行仅三个数n,m,k。

Output

  输出仅一行一个整数表示能得到的最大“赢面”。

Sample Input

输入1:3 3 8 输入2:7 14 86

Sample Output

输出1:5 输出2:1398

Hint

【数据规模】
  对于50%的数据0<N,M≤30; 
  对于100%的数据0<N,M≤30000;K≤N*M。
 
 
 

简单的数学题,很显然,只有棋子摆在一起的时候答案才会最优,于是便很容易推出计算式子

枚举第一行的棋子个数,假设除最后一行外,其他都是i个

注意如果说余数超过m就不可行,可以在更后面被计算到

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int main(){
 5     long long n,m,k;
 6     cin>>n>>m>>k;
 7     long long ans=0;
 8     for(long long i=2;i<=n;i++){
 9         long long l=k/i;
10         if(l>m)continue;
11         if(l==0)break;
12         long long rest=k%i;
13         if(rest>m)continue;
14         long long temp=(i-1)*i/2*(l-1)*l/2;
15         temp+=(rest-1)*rest/2*l;
16         ans=max(ans,temp);
17     }
18     cout<<ans;
19     return 0;
20 }

over

原文地址:https://www.cnblogs.com/saionjisekai/p/9825953.html