毕业好几年了,对算法还是比較有兴趣,所以想又一次開始做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; }
}


最新文章

  1. JavaScript学习笔记(三)——this、原型、javascript面向对象
  2. unity行为树制作AI简单例子(2)
  3. jquery阻止事件冒泡的3种方式
  4. OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters
  5. javaee web项目的目录结构
  6. wsus客户端/服务器检查更新
  7. org.springframework.web.context.ContextLoaderListener 转
  8. Java吸收换行符
  9. bootchart--检测linux启动性能的软件
  10. 使用opencv传中文文件崩溃
  11. WebRTC–getUserMedia-filter
  12. 【codeforces 698C】LRU
  13. RecyclerView 刷新后自动滚动的问题,notifyDataSetChanged 后自己滚动
  14. iframe子页面与父页面元素的访问以及js变量的访问[zhuan]
  15. Lodop打印语句最基本结构介绍(什么是一个任务)
  16. linux(kali,centos)安装vm及其提示缺少c头文件解决方法
  17. 阿里云对象存储oss上传文件夹
  18. 关于源码输出,浏览器不解析Html标签
  19. Django服务器启动时指定端口和IP方法
  20. nodejs zip压缩版安装与配置

热门文章

  1. php正则表达式,在抓取内容进行匹配的时候表现不稳定
  2. Golang源码探索(二) 协程的实现原理
  3. CentOS系统中出现错误--SSH:connect to host centos-py port 22: Connection refused
  4. C#3.0中的扩展方法
  5. 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作
  6. 73、django之setting配置汇总
  7. 写一个PHP函数,实现扫描并打印出指定目录下(含子目录)的所有jpg文件名
  8. linux使用yum安装mariadb
  9. 创建简单的Python列表
  10. 做技术,有没有必要参加IT培训