有很多这样的题,给一个这样的集合,让你去找几个数使他们加起来满足什么条件,一般要找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 }