Bob's Problem

来源:互联网 发布:网格优化的流程及思路 编辑:程序博客网 时间:2024/04/29 20:53

Bob's Problem

Accepted : 47Submit : 307Time Limit : 1000 MSMemory Limit : 65536 KB 

题目描述

Bob今天碰到一个问题,他想知道x 3 +y 3  = c 是否存在正整数解?

输入

第一行是一个整数K(K≤20000),表示样例的个数。 以后每行一个整数c(2≤c≤10 9)

输出

每行输出一个样例的结果,如果存在,输出“Yes”,否则输出“No”。(引号不用输出)

样例输入

22827

样例输出

YesNo
一开始我用的是二重循环,每个的上限是pow(c,1/3.0),结果TLE。后来我想用数组先把可行解存起来,范围太大。后来又读了一遍题,想到i和j的取值范围实际上是一样的,且这个范围<=1000.因为c<=10^9故每一个i或j不可能超过1000。所以可以先将1~1000内的每个数的立方算出并存到数组a中。接下来用二分查找s减每个小于s的a[i]。在减小时间复杂度的思考过程中很有感觉。
我的代码:
#include<cstdio>#include<cstring>#include<cmath>int a[1005];int bs(int x){int l=1,r=1000,mid;while(r>=l){mid=(l+r)/2;if(a[mid]==x)return 1;else if(a[mid]<x)l=mid+1;elser=mid-1;}return 0;}int main(){int k,i,j,flag,s,c;for(i=1;i<=1000;i++){a[i]=i*i*i;}scanf("%d",&k);while(k--){flag=true;scanf("%d",&c);for(i=1;i<=1000;i++){s=c-a[i];if(bs(s)){printf("Yes\n");flag=false;break;}}if(flag)printf("No\n");}return 0;}
题解:用到了set集合,STL还未系统学习,暂不分析。
#include <iostream>#include <cstring>#include <cstdio>#include <set>#include <algorithm>using namespace std;int nb[3000],tot=0;int main(){  freopen("std.in","r",stdin);  freopen("out.txt","w",stdout);  set<int> st; st.clear();  for(int i=1;i<1010;i++)  {    nb[tot++]=i*i*i;  }  for(int i=0;i<tot;i++)  {    for(int j=i;j<tot;j++)    {      st.insert(nb[i]+nb[j]);    }  }  int a,T_T;while(scanf("%d",&T_T)!=EOF){while(T_T--){  scanf("%d",&a);  int flag=st.count(a);  if(flag) puts("Yes");  else puts("No");}}  return 0;}


0 0
原创粉丝点击