有很多这样的题,给一个这样的集合,让你去找几个数使他们加起来满足什么条件,一般要找4~6个数什么的,直接做就会超时,可以折半找2~3个数并将它们结果存起来,再另找2~3个数去验证。
这样讲n^4~n^6就变成了n^2~n^3(用hash的话)
View Code
1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 static int pow(int a,int n) 6 { 7 int ans=1; 8 while(n>0) 9 { 10 ans*=a; 11 n--; 12 } 13 return ans; 14 } 15 public static void main(String arg[]) 16 { 17 Scanner cin=new Scanner(System.in); 18 int target,len; 19 while(true) 20 { 21 char s[]; 22 target=cin.nextInt(); 23 s=cin.next().toCharArray(); 24 if(target==0&&s[0]=='E'&&s[1]=='N'&&s[2]=='D') 25 break; 26 len=s.length; 27 Arrays.sort(s); 28 HashMap<Integer,String> hash=new HashMap<Integer,String>(); 29 hash.clear(); 30 for(int i=len-1;i>=0;i--) 31 { 32 for(int j=len-1;j>=0;j--) 33 { 34 if(i==j) 35 continue; 36 for(int k=len-1;k>=0;k--) 37 { 38 if(i==k||j==k) 39 continue; 40 int tp=-pow(s[i]-'A'+1,3)+pow(s[j]-'A'+1,4)-pow(s[k]-'A'+1,5)+target; 41 if(hash.containsKey(tp)) 42 continue; 43 String ss=String.valueOf(s[i])+String.valueOf(s[j])+String.valueOf(s[k]); 44 hash.put(tp, ss); 45 //System.out.println("<"+tp+","+ss+">"); 46 } 47 } 48 } 49 boolean flag=false; 50 String ans = null; 51 for(int i=len-1;i>=0;i--) 52 { 53 for(int j=len-1;j>=0;j--) 54 { 55 if(i==j) 56 continue; 57 int t=s[i]-'A'+1-pow(s[j]-'A'+1,2); 58 if(hash.containsKey(t)) 59 { 60 String tp=hash.get(t); 61 char ss[]=tp.toCharArray(); 62 int k; 63 for(k=0;k<3;k++) 64 { 65 if(ss[k]==s[i]||ss[k]==s[j]) 66 { 67 break; 68 } 69 } 70 if(k==3) 71 { 72 flag=true; 73 ans=String.valueOf(s[i])+String.valueOf(s[j])+tp; 74 break; 75 } 76 } 77 } 78 if(flag) 79 break; 80 } 81 if(flag) 82 System.out.println(ans); 83 else 84 System.out.println("no solution"); 85 } 86 } 87 }