TCHS 90-2 (全集的所有子集问题)

此题为给一个集合,求所有子集中的某一个子集,这个子集满足条件:

1,此集合的和为一个level2幸运数字,该数字要么全是7,要么全是4

2,该集合为满足条件中所有数组中和最大的一个

3,如果有多个这样的数组,返回字典序最小的那个。

其中比较重要的算法就是求一个集合的所有子集:

如下:

int [] numbers ={};

ArrayList al = new ArrayList();

Arrays.sort(numbers);

int t=1<<numbers.length;

int i;

for(i=0;i<t;i++)

{

ArrayList a = new ArrayList();

int j=i;

int k=0;

while(j>0)

{

if((j&1)>0) //与运算判断j第k位是否为1,来决定第k个元素在不在地i个子集中

{

a.add(numbers[k]);

}

k++;

j=j>>1;   //右移一位来继续判断

}

al.add(a);

}

该题解为:

还有一些漏洞:最后一个用例过不了,字典序还有一些问题。

import java.util.*;

public class TheLuckyNumbersLevelTwo

{

public static boolean confirm(long numbers)

{

String s =String.valueOf(numbers);

if (s.charAt(0)==‘4‘)

{

for(int x=0;x<s.length();x++)

{

if(s.charAt(x)==‘4‘)

;

else

return false;

if(x==s.length()-1)

return true;

}

}

if(s.charAt(0)==‘7‘)

{

for(int x=0;x<s.length();x++)

{

if(s.charAt(x)==‘7‘)

;

else

return false;

if(x==s.length()-1)

return true;

}

}

return false;

}

public static void sop(Object obj)

{

System.out.println(obj);

}

public static int [] find(int [] numbers)

{

ArrayList al = new ArrayList();

Arrays.sort(numbers);

int t=1<<numbers.length;

int i;

for(i=0;i<t;i++)

{

//System.out.println(i);

ArrayList a = new ArrayList();

int j=i;

int k=0;

while(j>0)

{

if((j&1)>0)

{

a.add(numbers[k]);

}

k++;

j=j>>1;

}

al.add(a);

}

int sum[]= new int [al.size()];

for(i=0;i<al.size();i++)

{

sum[i]=0;

ArrayList p= (ArrayList)al.get(i);

for(int j=0;j<p.size();j++)

{

sum[i]+=(int)p.get(j);

}

}

for(i=0;i<sum.length;i++)

{

int min = sum[i];

ArrayList minlist=(ArrayList) al.get(i);

for(int j=i+1;j<sum.length;j++)

{

if(min>sum[j])

{

int k=min;

min=sum[j];

sum[j]=k;

ArrayList w=minlist;

minlist=(ArrayList)al.get(j);

al.set(j, w);

}

}

sum[i]=min;

al.set(i, minlist);

}

for(i=sum.length-1;i>=0;i--)

{

if(confirm(sum[i]))

{

ArrayList p=(ArrayList)al.get(i);

ArrayList p1=(ArrayList)al.get(i-1);

if(i>=1)

if(sum[i]==sum[i-1])

{

if((int)p.get(0)>(int)p1.get(0))

{

p=p1;

}

}

int array[]=new int[p.size()];

for(int x=0;x<p.size();x++)

array[x]=(int) p.get(x);

return array;

}

}

int a[]={};

return a;

}

public static void main(String[] args)

{

int x [] ={1, 2, 3, 4};

int a[];

a=find(x);

for(int y=0;y<a.length;y++)

System.out.println(a[y]);

}

}

时间: 2024-10-13 14:51:26

TCHS 90-2 (全集的所有子集问题)的相关文章

算法1(全集的所有子集)

此题为给一个集合,求所有子集中的某一个子集,这个子集满足条件: 1,此集合的和为一个level2幸运数字,该数字要么全是7,要么全是4 2,该集合为满足条件中所有数组中和最大的一个 3,如果有多个这样的数组,返回字典序最小的那个. 其中比较重要的算法就是求一个集合的所有子集: 如下: int [] numbers ={}; ArrayList al = new ArrayList(); Arrays.sort(numbers); int t=1<<numbers.length; int i;

TCHS 90 回文数

求解思路是把数字转换成字符串,进行判断,级数 public class Test {    public static void main(String args [])    {        TheLuckyNumbersLevelOne a = new TheLuckyNumbersLevelOne();        System.out.println(a.find(4567823,7891456));            }} class TheLuckyNumbersLevelO

[Leetcode 90]求含有重复数的子集 Subset II

[题目] Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. [思路] 注意sort,使得判断临接元素是否相邻. 与leetcode78类似,多了一个重复数判断条件 if(i>flag&&nums

50道hdu基础搜索总结(转)

Dfs: 大部分是直接递归枚举,即求满足约束条件下的解,虽不用剪枝,但也需要代码能力. 练习递归枚举的题目: 1241       Oil Deposits (dfs的连通块个数) 1016       Prime Ring Problem 1584       蜘蛛牌(简单dfs,简单的剪枝,还有人用DP做(???)) 1426       Sudoku Killer(练习递归的好题目 or Dancing links(???)) 2510       符号三角形(打表题,写写打表程序还是不错

专题——计数原理

由于最近在研究数论,所以这期为大家带来一个数论中的专题--计数原理,下面我们来看四个概念: 一.配对原理: 对于集合A.B,如果存在一个一一映射,f:A→B,则|A|=|B|,假如我们很难计算A的值,不如转变方法,先计算B的值,再根据一一映射反推A,这时就需要找到这样一个易于计算的B,这需要很高的技巧.二.容斥原理: <1>容斥原理 把集合A分成子集A1,A2,A3,-,Am,即:A=A1∪A2∪A3-∪Am ,简单的来说,要求的集合是等于全集减去所有子集相交的重复的部分. <2>

集合的异或运算(对称差)

1.集合的异或运算(AΔB)定义属于A或属于B,但不同时属于A和B的元素的集合称为A和B的对称差,即A和B的异或. 注:草绿色部分即为 AΔB 2.对称差(异或)运算的定律2.1 AΔB = (A-B)∪(B-A) = (A∪B)-(A∩B)该公式的证明已在 集合的证明及相关习题 中证明了 2.2 对称差运算的交换律(AΔB)ΔC = (AΔC)ΔB 注:图1中草绿色部分为 (AΔB) ,三角形区域为 C ,(AΔB)ΔC  = 仅含草绿色或仅含三角形的区域注:图2中草绿色部分为 (AΔC) ,

搜索题推荐

(转自网络博客): POJ POJ 1376 – Robot(基础) http://acm.pku.edu.cn/JudgeOnline/problem?id=1376 题意:略 解法:bfs,A*-. POJ 2688 – Cleaning Robot(基础) http://acm.pku.edu.cn/JudgeOnline/problem?id=2688 题意:bfs后转换为tsp问题 解法:bfs+dp,bfs+dfs 相关:http://hi.baidu.com/zfy0701/blo

聊聊数据库~开篇

1.前言 总是聊并发的话题,聊到大家都免疫了,所以这次串讲下个话题--数据库(欢迎纠正补充) 看完问自己一个问题来自我检测:NoSQL我到底该怎么选? 1.1.分类 主要有这么三大类:[再老的数据库就不说了] 1.传统数据库(SQL): 关系数据库:SQLite.MySQL.SQLServer... 2.高并发产物(NoSQL): 键值数据库:Redis.MemCached... 文档数据库:MongoDB.CouchBase.CouchDB.RavenDB... 列式数据库:Cassandra

[Leetcode 40]组合数和II Combination Sum II

[题目] Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target. Each number in candidates may only be used once in the combination. Note: A