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

长方形

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

时间: 2024-12-31 19:43:01

2013编程之美资格赛之长方形(Java实现)的相关文章

2013编程之美资格赛之树上的三角形(Java实现)

树上的三角形 时间限制: 2000ms 内存限制: 256MB 描述 有一棵树,树上有只毛毛虫.它在这棵树上生活了很久,对它的构造了如指掌.所以它在树上从来都是走最短路,不会绕路.它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢? 输入 输入数据的第一行包含一个整数 T,表示数据组数. 接下来有 T 组数据,每组数据中: 第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号). 接下来的 N-1

2013编程之美资格赛总结

终于可以完成一个程序比赛的题目了,虽然这次的时间有些长.这是第一次完成,感到真心不错.参加程序比赛是受舍友的影响,但很快就喜欢上了.但,从前不见第一次参加程序比赛--腾讯的编程马拉松,一个题不会,连提交代码的心思都没有.到第二次,参加百度的百度之星,百度之星参加了两次区域赛,第一次做的唯一一道题连题意都没有明白,结果不言而喻,失败:第二次区域赛,明白了题意,写出来代码,但提交结果还是失败,因为没有对于大数据进行思考.这就是参加的两次比赛的情况.这是第三次参加,是微软的编程之美,依据现在的结果,感

2013编程之美资格赛之传话游戏(Java实现)

传话游戏 时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位.然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位--以此类推,直到倒数第二位告诉Bob.两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释.最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家.  由于传话过

2013编程之美资格赛之大数据测试(JAVA)

传话游戏大数据通过 长方形WA.原因是求长方形数量时,用到了四数连乘,哦,其结果就是超出Int型表示的范围,WA是必然的. 树上的三角形TLE.这个也是在情理之内,由于我连树的构造都不太会实现,自己想的一种方法构造了一种类树(就是类似的树).时间会比较长,超时也在情理之中. 哦.说一下结果,   题目1 题目2 题目3 名次 大赛ID 得分 罚时 10分 20分 15分 20分 15分 20分 622 fxleyu 60 165:32:12 AC AC AC WA AC TLE  好吧,这就是这

2013编程之美资格赛【传话游戏】

时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位.然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位--以此类推,直到倒数第二位告诉Bob.两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释.最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家.  由于传话过程中可能出

2013编程之美全国挑战赛第二场-集会

昨天做编程之美的题感觉只有这一道是水题.思路没问题但是写程序写错了一个地方没AC.今天翻出来想了一下终于解决了. 解题思路: 要寻找的这个目标点的纵坐标为0,设横坐标为x.以示例数据为例,可以得到目标点到这些点的距离,更直观一点,绘制成图形点击查看.观察可知符合要求的点可能出现的位置是某两个抛物线的交点或者某个抛物线的顶点.求出这些点来比较计算出的距离,取最小的即可.没机会提交的代码如下: import java.util.Scanner; public class Main { public

2013编程之美全国挑战赛资格赛之传话游戏

时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位.然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位--以此类推,直到倒数第二位告诉Bob.两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释.最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家.  由于传话过程中可能出

2013编程之美全国挑战赛第一场-传话游戏

传话游戏 时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位.然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位--以此类推,直到倒数第二位告诉Bob.两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释.最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家. 由于传话过程

2013编程之美全国挑战赛第一场-树上的三角形

树上三角形 时间限制: 2000ms 内存限制: 256MB 描述 有一棵树,树上有只毛毛虫.它在这棵树上生活了很久,对它的构造了如指掌.所以它在树上从来都是走最短路,不会绕路.它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢? 输入 输入数据的第一行包含一个整数 T,表示数据组数. 接下来有 T 组数据,每组数据中: 第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号). 接下来的 N-1 行