链接:点击打开链接
1001 Missing number 直接开一个数组记录某个数字是否出现过,就能找到没有出现的两个数字了。更好的空间为 O(1) 的做法是用 n(n+1)2 减去出现数字可以得到两个数字的和,同理一样的方法也可以得到两个数字的平方和,就能解出这两个数字了。
#include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<map> using namespace std; int a[1111]; map<int,int>vis; int main() { int n,t,i,j; cin>>t; while(t--) { cin>>n; vis.clear(); for(i = 0; i < n; ++i) { cin>>a[i]; vis[a[i]]=1; } int flag=0; for(i=1;;i++) { if(!vis[i]) { cout<<i<<" "; break; } } for(i++;;i++) { if(!vis[i]) { cout<<i<<"\n"; break; } } } return 0; }
开始写了个dfs暴力估计是终评TLE了,其实写的时候就考虑过了,时间复杂度是最大是O(40!)左右1002 Fibonacci Fibonacci序列在 109 范围内只有43个数,则它们的乘积不超过 109 的数也不会很多,直接搜索即可。
Accepted(Past)
#include<iostream> #include<cstdio> using namespace std; __int64 a[160]={0,1},tem,n; bool dfs(int i,__int64 pro) { if(pro==n)return 1; if(pro>n)return 0; //cout<<"i="<<i<<" "<<endl; while(pro * a[i]>n && i>0)i--; for(;i>2;i--) if(dfs(i,pro * a[i]))return 1; //cout<<"i="<<i<<" "<<endl; return 0; } int main() { int i,j,t; for(i=2;i<50;i++) { a[i]=a[i-1]+a[i-2]; //cout<<a[i]<<" "<<i<<endl; }//puts(""); scanf("%d",&t); while(t--) { scanf("%I64d",&n); i=44;while(a[i]>n)i--; //cout<<i<<" "<<a[i]<<endl; if(dfs(i,1))printf("Yes\n"); else printf("No\n"); } return 0; }
AC:
#include<iostream> #include<cstdio> using namespace std; int a[160]={0,1},b[111]; int flag,n; bool dfs(int i,int pro) { if (pro == 1) return true; for (; i < flag; i++) if (pro % b[i] == 0) { if (dfs(i,pro / b[i])) return true; } return 0; } int main() { int i,j,t; for(i=2;i<50;i++) a[i]=a[i-1]+a[i-2]; while(~scanf("%d",&t)) while(t--) { scanf("%d",&n); if(0==n) { printf("Yes\n");continue; } flag = 1; for (i = 3; i < 46; i++) if (n % a[i] == 0) b[flag++] = a[i]; if(dfs(1,n))printf("Yes\n"); else printf("No\n"); } return 0; } //*/