Qual_B:长方形

Qual_B:长方形

总时间限制: 
2000ms 
单个测试点时间限制: 
1000ms 
内存限制: 
262144kB
描述

在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。

输入
输入文件包含多组测试数据。
第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。
每组数据为三个用空格隔开的整数 N,M,K。

1 ≤ T ≤ 100
0 ≤ K ≤ N * M
小数据:0 < N, M ≤ 30
大数据:0 < N, M ≤ 30000
输出
对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。所有数据按读入顺序从1开始编号。
样例输入
3
3 3 8
4 5 13
7 14 86
样例输出
Case #1: 5
Case #2: 18
Case #3: 1398
  • #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<iomanip>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<set>
    #include<map>
    using namespace std;
    int m,n,k;
    long long C(long long n)
    {
    	return (n*(n-1))>>1;
    }
    int main()
    {
    	int t;
    	cin>>t;
    	for(int i=1;i<=t;++i)
    	{
    		cin>>n>>m>>k;
    		if(m>n) swap(m,n);
    		int r=sqrt(k);
    		r=min(r,m);
    		int c=min(k/r,n);
    		long long ans=0;
    		while(r>=2&&c<=n)
    		{
    			long long tmp=C(r)*C(c);
    			int a=k-r*c;
    			if(c<n) tmp+=C(a)*c;
    			else tmp+=C(a)*r;
    			ans=max(ans,tmp);
    			--r;
    			c=k/r;
    		}
    		cout<<"Case #"<<i<<": "<<ans<<endl;
    	}
    	return 0;
    }
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值