2013编程之美资格赛之长方形(Java实现)

简介: 长方形 时间限制: 1000ms 内存限制: 256MB 描述 在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。 输入 输入文件包含多组测试数据。 第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。 每组数据为三个用空格隔
长方形


时间限制: 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




主要算法:
define 输出集合L
get T
for 1 to T
get N,M,K
L.add(getResult(N,M,K))
print L


getResult算法:
define R=-1
get Min={N,M}, Max={N,M}
get minK=(int)sqrt(K)
if minK>Min
minK=Min
for minK to 2
x=minK;
y=K/x;
if y>max
break;
z=K%x;
result=(x*(x-1)*y*(y-1))/4;
if(z>1){
if(y<max)
result=result+(y*z*(z-1))/2;
else{
result=result+(x*z*(z-1))/2;
}
}
if result>R
R=result
return R


程序:

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args){	
		Scanner sc=new Scanner(System.in);
		int T=sc.nextInt();
		int[] result=new int[T];
		for(int i=0;i<T;i++){
			int M=sc.nextInt();
			int N=sc.nextInt();
			int K=sc.nextInt();
			result[i]=getNum(M,N,K);
		}
		printResult(result);
	}

	private static int getNum(int m, int n, int k) {
		int result=0;
		int max=n;
		int min=m;
		if(m>n){
			min=n;
			max=m;
		}
		int start=new Double(Math.sqrt(k)).intValue();
		if(start>min)
			start=min;
		for(int i=start;i>1;i--){
			int x=i;
			int y=k/x;
			if(y>max)
				break;
			int z=k%x;
			int s=getResult(x,y,z,max,min);
			if(s>result){
				result=s;
			}
		}
		return result;
	}

	private static int getResult(int x, int y, int z, int max, int min) {
		int result=(x*(x-1)*y*(y-1))/4;
		if(z>1){
			if(y<max)
				result=result+(y*z*(z-1))/2;
			else{
				result=result+(x*z*(z-1))/2;
			}
		}
		return result;
	}

	private static void printResult(int[] result) {
		for(int i=0;i<result.length;i++){
			System.out.println("Case #"+(i+1)+": "+result[i]);
		}
	}
}


这个Java代码实现也是通过了比赛的小数据测试,但数据测试未知。

——20130408


PS:

今天早晨数据出来了,这道题的大数据测试是WA,回答错误。在情理之外,但也发现了原因。原因见博文《2013编程之美资格赛之大数据测试(Java实现)》

——20130409



相关文章
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
233 1
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
177 6
|
2月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
168 0
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
719 1
|
3月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
471 100
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
350 1
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
276 16
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
1056 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
221 1