毕业好几年了,对算法还是比較有兴趣,所以想又一次開始做ACM题。俺做题比較任意,一般先挑通过率高的题来做。

第1204题,详细描写叙述请參考,ZOJ ACM 1204

1)难度分析

这个题目,基本的难度在于要依据长度来排序。

比方1 2 3 4 5 6。结果必须为:

1+2=3
1+3=4
1+4=5
1+5=6
2+3=5
2+4=6
1+2+3=6

可是我的结果为:

1+2=3

1+2+3=6

1+3=6

。。。

2)解决方法

将结果缓存,依据长度排序后再打印。

3)AC的源代码。假设要直接提交,请将中文凝视删除。

import java.util.Collections;
import java.util.Comparator; public class Main {
static int lineNumber;
static int input[];
static int M = 4;
static boolean hasR = false;
static java.util.ArrayList<int []> results; public static void main(String[] args) {
<span style="white-space:pre">		</span>//排序算法重写
Comparator<int []> comparator = new Comparator<int []>(){
public int compare(int []r1, int []r2) { if(r1[0] != r2[0]){
return r1[0]-r2[0];
}
else {
return 0;
}
}
}; java.util.Scanner scanner = new java.util.Scanner(System.in); if(scanner.hasNext()) {
lineNumber = Integer.parseInt(scanner.nextLine());
}
int lineIndex = 0;
while(scanner.hasNext()) {
lineIndex++;
hasR = false; String lineStr = scanner.nextLine(); String strs[] = lineStr.split(" ");
M = Integer.parseInt(strs[0]);
input = new int[M];
results = new java.util.ArrayList<int []>(); for(int j=0; j<M;j++) {
input[j] = Integer.parseInt(strs[j+1]);
}
java.util.Arrays.sort(input); //<span style="font-family: Arial, Helvetica, sans-serif;">//说明:比較关键,由于一開始没有注意看题,没有考虑输入的一行数字可能是无序的,直接依照升序处理。</span> fn(0,0,0,new int[33]); if(hasR == false) {
System.out.println("Can't find any equations.");
} else {
Collections.sort(results,comparator); for(int i = 0;i<results.size();i++) {
int count = results.get(i)[0];
for(int j=1;j<=count;j++) {
System.out.print(results.get(i)[j]);
if(j<count){
System.out.print("+");
}
}
System.out.println("="+results.get(i)[count+1]);
}
} System.out.println("");
if(lineIndex == lineNumber) {
break;
}
}
} public static long fn(int i, int sum, int count, int[] res) {
long r; if(i==M)return -1;
if(sum >input[M-1]) return -1; //说明:比較关键。直接决定了算法的时间复杂度,没有这个推断。计算超时。 if (sum == input[i]) {
hasR = true;
res[count+1] = sum;
results.add(res);
} if (i < M - 1) {
int res_new[] = new int[33];
for (int k = 0; k <= count + 1; k++) {
res_new[k] = res[k];
}
res_new[0] = count + 1;
res_new[count + 1] = input[i];
fn(i + 1, sum + input[i], count + 1, res_new); fn(i + 1, sum, count, res);
} return -1; }
}


ZOJ ACM 1204 (JAVA)的更多相关文章

  1. ZOJ ACM 1314(JAVA)

    昨天做了几个题目.过于简单,就不在博客里面写了. 1314这道题也比較简单,写出来是由于我认为在这里有一个小技巧,对于时间复杂度和空间复杂度都比較节省. 这个题目类似哈希表的求解.可是更简单.刚拿到题 ...

  2. ACM之Java速成(4)

    ACM中Java.进制转换 Java进制转换: 由于Unicode兼容ASCII(0-255),因此,上面得到的Unicode就是ASCII. java中进行二进制,八进制,十六进制,十进制间进行相互 ...

  3. ACM之Java速成(3)

    ACM中Java.大数处理 先上个代码: import java.math.*; import java.util.*; class Main{ public static void main(Str ...

  4. ACM之Java速成(2)

    acm中Java的应用 Chapter I. Java的优缺点各种书上都有,这里只说说用Java做ACM-ICPC的特点: (1) 最明显的好处是,学会Java,可以参加Java Challenge ...

  5. ACM中java的使用

    ACM中java的使用 转载自http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输 ...

  6. ACM之Java输入输出

    本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...

  7. ACM中java的使用 (转)

    ACM中java的使用 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner ...

  8. ACM中Java的应用

    先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C++的程序员来说Java 并不难学,两周时间基本可以搞定一般的编程,再用些时间了解一下Java库就行了.Java的语法和C++非常类似, ...

  9. ACM之Java技巧

    一.Java之ACM注意点 关于四舍五入 小数保留几位:  DecimalFormat df = new DecimalFormat("0.00"); String num = d ...

随机推荐

  1. 配置好postfix邮件服务器之后就可以使用它来发送邮件了

    下面是一段摘自W3school关于php mail函数的栗子,经过测试发现两个问题. <?php $to = "somebody@example.com, somebodyelse@e ...

  2. w3wp.exe已附加有调试器,但没有该调试器配置为调试此未经处理的异常,若要调试此异常,必须分离当前的调试器。

    之前通过使用VS2010附加进程调试项目后,今天开机发现调试本机的项目报错如下图: 到网上到处查看无果,经过反复实验找到解决方法,我的项目是发布到IIS的 1.首先删除IIS上面的项目 2.在VS右击 ...

  3. day2--SecureCRT的配置

    生产中,我们是看不到虚拟机的工作界面,虚拟机的界面相当于机房显示屏的样子,实际上我们是在操作工具里面进行管理,这里使用SecureCRT远程连接虚拟机,SecureCRT的设置如下: 1.打开Secu ...

  4. 开源API测试工具 Hitchhiker v0.4更新 - 没有做不到,只有想不到

    Hitchhiker 是一款开源的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起管理Api. 详细介绍 ...

  5. Hiberante知识点梳理

    Hibernate简介 Hibernat是一个ORM(关系映射)框架,对JDBC访问数据库的操作进行了简化,并且将数据库表中的字段和关系映射为对象,简化了对数据库的操作. 使用方法 读取并解析配置文件 ...

  6. C#去掉字符串头尾指定字符

    private void button2_Click(object sender, EventArgs e)        {//去掉字符串头尾指定字符            string MyInf ...

  7. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生

    在struts2中有很多种跳转方式如下是在struts-default.xml截取的一段源码,常用的跳转有 转发:dispatcher.重定向:redirect.转发到Action:chain.重定向 ...

  8. ORA-01843: 无效的月份

    1.插入的日期如果是DateTime类型的,没有影响 2.如果DateTime.ToString()获取的日期,就会报错,例如(@param_datetime = cf.GetServerDateTi ...

  9. better-scroll 实现tab栏目滑动当前高亮始终在可视区

    https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll better-scroll文档地址 如图 ,是我们要实现的 ...

  10. 用Python写一款属于自己的 简易zip压缩软件 附完成图(适合初学者)

    一.软件描述 用Python tkinter模块写一款属于自己的压缩软件.zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile来操作zip文件,具有功能:zip压缩功能,zip ...