您的位置:首页 > 其它

POJ 1248

2012-09-01 08:51 239 查看
有很多这样的题,给一个这样的集合,让你去找几个数使他们加起来满足什么条件,一般要找4~6个数什么的,直接做就会超时,可以折半找2~3个数并将它们结果存起来,再另找2~3个数去验证。

这样讲n^4~n^6就变成了n^2~n^3(用hash的话)

View Code

import java.util.*;
import java.math.*;
class Main
{
static int pow(int a,int n)
{
int ans=1;
while(n>0)
{
ans*=a;
n--;
}
return ans;
}
public static void main(String arg[])
{
Scanner cin=new Scanner(System.in);
int target,len;
while(true)
{
char s[];
target=cin.nextInt();
s=cin.next().toCharArray();
if(target==0&&s[0]=='E'&&s[1]=='N'&&s[2]=='D')
break;
len=s.length;
Arrays.sort(s);
HashMap<Integer,String> hash=new HashMap<Integer,String>();
hash.clear();
for(int i=len-1;i>=0;i--)
{
for(int j=len-1;j>=0;j--)
{
if(i==j)
continue;
for(int k=len-1;k>=0;k--)
{
if(i==k||j==k)
continue;
int tp=-pow(s[i]-'A'+1,3)+pow(s[j]-'A'+1,4)-pow(s[k]-'A'+1,5)+target;
if(hash.containsKey(tp))
continue;
String ss=String.valueOf(s[i])+String.valueOf(s[j])+String.valueOf(s[k]);
hash.put(tp, ss);
//System.out.println("<"+tp+","+ss+">");
}
}
}
boolean flag=false;
String ans = null;
for(int i=len-1;i>=0;i--)
{
for(int j=len-1;j>=0;j--)
{
if(i==j)
continue;
int t=s[i]-'A'+1-pow(s[j]-'A'+1,2);
if(hash.containsKey(t))
{
String tp=hash.get(t);
char ss[]=tp.toCharArray();
int k;
for(k=0;k<3;k++)
{
if(ss[k]==s[i]||ss[k]==s[j])
{
break;
}
}
if(k==3)
{
flag=true;
ans=String.valueOf(s[i])+String.valueOf(s[j])+tp;
break;
}
}
}
if(flag)
break;
}
if(flag)
System.out.println(ans);
else
System.out.println("no solution");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: