时间限制: 1000ms 内存限制: 256MB
描述
在 N × M 的网格上,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
输入
输入文件包含多组测试数据。
第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。
每组数据为三个用空格隔开的整数 N,M,K。
输出
对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。所有数据按读入顺序从1开始编号。
数据范围
1 ≤ T ≤ 100
0 ≤ K ≤ N * M
小数据:0 < N, M ≤ 30
大数据:0 < N, M ≤ 30000
-
样例输入
-
3 3 3 8 4 5 13 7 14 86
样例输出
-
Case #1: 5 Case #2: 18 Case #3: 1398
AC代码:
#include <stdio.h> int column(int num, int time) { int i; int sum; int aa; if(time < 1) { sum = 0; } else { sum = (num * (num + 1)) >> 1; aa = (time * (time + 1)) >> 1; sum *= aa; } return sum; } int row(int num, int time) { int sum; int aa; if(time < 1) { sum = 0; } else { sum = num; aa = (time * (time + 1)) >> 1; sum *= aa; } return sum; } int main() { int T; int N; int M; int K; int count = 0; int min; int max; int num; int num2; int x; int y; int i; freopen("in.txt", "r", stdin); scanf("%d", &T); while(T--) { count++; num = 0; scanf("%d %d %d", &N, &M, &K); if(K < 4) { num = 0; } else if(K == 4) { num = 1; } else { min = N > M ? M : N; max = N > M ? N : M; num = 0; for(i = min; i > 2; i--) { x = K / i; if(x > max || (x == max && (K % i) != 0)) { break; } num2 = column(i - 1, x - 1); y = K % i; num2 += row(x, y - 1); if(num < num2) { num = num2; } } for(i = max; i > 2; i--) { x = K / i; if(x > min || (x == min && (K % i) != 0)) { break; } num2 = column(i - 1, x - 1); y = K % i; num2 += row(x, y - 1); if(num < num2) { num = num2; } } } printf("Case #%d: %d\n", count, num); } return 0; }