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天前
|
存储 Java
JAVA并发编程AQS原理剖析
很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》,希望可以帮到大家巩固相关核心技术原理。今天我们聊聊AQS....
|
2天前
|
Java 程序员 数据库连接
Java编程中的异常处理:从基础到进阶
【9月更文挑战第18天】在Java的世界里,异常处理是每个程序员必须面对的挑战。本文将带你从异常的基本概念出发,通过实际的代码示例,深入探讨如何有效地管理和处理异常。我们将一起学习如何使用try-catch块来捕捉异常,理解finally块的重要性,以及如何自定义异常类来满足特定需求。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的Java代码更加健壮和可靠。
|
2天前
|
Java 数据库连接 UED
掌握Java编程中的异常处理
【9月更文挑战第18天】在Java的世界中,异常是那些不请自来的客人,它们可能在任何时候突然造访。本文将带你走进Java的异常处理机制,学习如何优雅地应对这些突如其来的“访客”。从基本的try-catch语句到更复杂的自定义异常,我们将一步步深入,确保你能够在面对异常时,不仅能够从容应对,还能从中学到宝贵的经验。让我们一起探索如何在Java代码中实现健壮的异常处理策略,保证程序的稳定运行。
|
2天前
|
Java 数据库
JAVA并发编程-一文看懂全部锁机制
曾几何时,面试官问:java都有哪些锁?小白,一脸无辜:用过的有synchronized,其他不清楚。面试官:回去等通知! 今天我们庖丁解牛说说,各种锁有什么区别、什么场景可以用,通俗直白的分析,让小白再也不怕面试官八股文拷打。
|
2天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
1天前
|
Java
JAVA并发编程ReentrantLock核心原理剖析
本文介绍了Java并发编程中ReentrantLock的重要性和优势,详细解析了其原理及源码实现。ReentrantLock作为一种可重入锁,弥补了synchronized的不足,如支持公平锁与非公平锁、响应中断等。文章通过源码分析,展示了ReentrantLock如何基于AQS实现公平锁和非公平锁,并解释了两者的具体实现过程。
|
2天前
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
8 0
|
20天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
23天前
|
机器学习/深度学习 Java TensorFlow
深度学习中的图像识别:从理论到实践Java中的多线程编程入门指南
【8月更文挑战第29天】本文将深入探讨深度学习在图像识别领域的应用,从基础理论到实际应用案例,带领读者一步步理解如何利用深度学习技术进行图像识别。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库实现一个基本的图像识别模型。无论你是初学者还是有一定经验的开发者,都能从中获得启发和学习。 【8月更文挑战第29天】在Java世界里,线程是程序执行的最小单元,而多线程则是提高程序效率和响应性的关键武器。本文将深入浅出地引导你理解Java多线程的核心概念、创建方法以及同步机制,帮助你解锁并发编程的大门。
|
2月前
|
传感器 数据采集 监控
Java串口编程入门
Java串口编程入门