一道OJ编程题总结

用暴力递归的话,以图中的测试用例为例,先让A号选择0号活,在让2-n 号员工选择1-5号活          有res1种

让A号选择1号活,在让2-n 号员工选择0, 2-5号活       有res2种

                    让A号选择2号活,在让2-n 号员工选择0-1,3-5号活     有res3种

。。。

让A号选择5号活,在让2-n 号员工选择0-4号活            有res5种

res = res1 + res2 + ... + res5

因为前1名员工选择了0活,为了让0不出现在候选列表中,需要将其对应的flag置为true, 表示其已被选择。

这种思路和在数组中找到出现次数大于一半的数中,一次删去2个数 的原理相同,也是通过改变其flag,并不是真的删去该数。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int num = Integer.parseInt(in.nextLine());
		List<Integer>[] list = new ArrayList[num];
		for(int i = 0; i < num; i++){
			list[i] = new ArrayList<>();
		}
		for(int i = 0; i < num; i++){
			String str = in.nextLine();
			for(int j = 0; j < str.length(); j++)
				list[i].add(str.charAt(j) - ‘0‘);
		}

		boolean[] flag = new boolean[6];
		process(list, 0, flag);

		System.out.println(res);

	}

	public static int res = 0; 

	public static void process(List<Integer>[] array, int index, boolean[] flag){

		if(index == array.length) return;
		List<Integer> list = array[index];
		for(int i = 0; i < list.size() ; i++){
			if(!flag[list.get(i)]){
				flag[list.get(i)] = true;
				if(index == array.length - 1)
					res++;
				process(array, index+1, flag);
				flag[array[index].get(i)] = false;
			}

		}
	}

}

  

时间: 2024-08-04 06:43:33

一道OJ编程题总结的相关文章

赛码网的一道百度编程题

最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例.目前给的通过率是83% 题目如下: 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大.她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z.之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ.之后则是三位.四位.五位--字母编号的,规则类似. 表格单

每天一道算法编程题(1)——网易笔试&quot;工程师工作安排“问题

首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep(牛客网)链接:https://www.nowcoder.com/discuss/22696?type=6&order=0&pos=5&page=2 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 vector&

杭电1013-Digitai Root(这是一道考研编程题-天大2015)

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 53625    Accepted Submission(s): 16747 Problem Description The digital root of a positive integer is found by summing the digits of

和Fibonacci数列有关的一道入门级编程题

vz9lo7及庇懦佣擞尉<http://weibo.com/20180411pp/230927983159307539320832?=Ro> z5b5tn菊始统沃湍踪<http://weibo.com/20180411p/230927983203570092351488?=5> p4vsuv庇儇们寻乩林<http://weibo.com/uFzp/230927983006954752315392> uyon6b盟菜郴星雷盟<http://weibo.com/p/2

上海华为的一道关于指针方面的编程题(C/C++)

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标. 尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路 注:我的方法的复杂度为O(n),大家如果有其它方法希望可以交流一下. /* author: jiangxin Blog: http://blog.csdn.net/jiangxinnju */ #include <ios

一道模板元编程题源码解答(replace_type)

今天有一同学在群上聊到一个比较好玩的题目(本人看书不多,后面才知是<C++模板元编程>第二章里面的一道习题), 我也抱着试一试的态度去完成它, 这道题也体现了c++模板元编程的基础和精髓: 类型就是数据. 题目如下所述: Write a ternary metafunction replace_type<c,x,y> that takes an arbitrary compound type c as its first parameter, and replaces all oc

一道编程题实在是不知道哪个地方错了

求帮忙 一道觉得很简单的编程题,提交了很多次,但是,还是wrong,实在是崩溃啊,真的不知道哪里错了,希望大家可以帮忙解决一下,感激不尽. 就是这道题----Conversions Description Conversion between the metric and English measurement systems is relatively simple. Often, it involves either multiplying or dividing by a constant

【求助】一道考验脑细胞的编程题

要求计算S的面积.注意:仅计算面积,不区分正负,如果围成的图形被x轴分割为上下两部分,那么就求上下两部分面积之和. 输入多项式fx,以字符串表示,格式为:4*x^5-x^2+5*x+12,多项式表达式不包含括号,可能包含空格.数字.字母x.^.*.+.-,保证多项式最高次幂为非负整数,且最高次幂不超过10. 表达式中4*x^5与4x^5等价,如下面的表达式是合法的: x^10-5x^1 -4*x^1 + 5x^0 2.3x^4 - 2.56*x + 1 输入不会出现下列类型的表达式: x(x+5

一道有意思的C语言编程题

最近在看经典的C语言入门书籍K&R,虽然是一本入门书籍,可是其中的精妙之处却需要慢慢体会.其中的经典题很多,仔细琢磨一定会收获良多. 今天看到这样一道题:编写一个删除C语言程序中所有的注释语句.感觉颇有意思,与大家一起分享一下: 我的思路: 找到注释的起始符号 \ 判断紧接着的输入字符,如果是*或者是\,则说明后面全是注释,跳过即可,否则照样输出 其他则直接输出 疑问: 所配套的答案书中提出要考虑引号后面的内容以做出响应,不是很明白这是为什么.个人认为无需考虑引号的影响也能将注释去除,希望有高手