7 条题解
-
2
#include<bits/stdc++.h> using namespace std; long long q,w,e,r,t,y,u,i,o,p,s,d,f,g,h,j,k,l,m,n,v,x,z,kk; int b[1000]; int a[1000]; int c[1000]; int main() { cin>>n; if(n%2==1) { cout<<"-1"; return 0; } i=1;x=2; while(n!=0) { if(x*2<=n) x*=2; if(x*2>n) { n-=x; cout<<x<<" "; x=2; } i++; } return 0; }
-
1
地球人看完题目首先想到的方法:
观察题目的样例,for example:
当输入的时,而,故记下答案4
此时
当时,而,故记下答案2
此时
输出答案
4 2
也就是说,对于,我们需要找到而,记下答案
然后n-=k,继续循环.
#include<bits/stdc++.h> using namespace std; int n; vector<int>res; int main(){ cin>>n; while(n>1){ int maxi=1; while(maxi*2<=n){ maxi*=2; } n-=maxi; res.push_back(maxi); }if(n)cout<<-1; else{ for(auto i:res)cout<<i<<" "; cout<<endl; } return 0; }
时间复杂度:
-
1
# include <bits/stdc++.h> using namespace std; int a[27] = {1}; int main() { int n; scanf("%d", &n); if (n % 2 == 1 || n == 2) { printf("-1\n"); } else { for (int i = 1; i <= 26; i++) { a[i] = a[i - 1] * 2; } for (int i = 26; i >= 1; i--) { if (n >= a[i]) { n -= a[i]; printf("%d ", a[i]); } } } return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int poww[35]={1}; int main() { int n,t; cin>>n; if (n%2==1) { cout<<-1; return 0; } for (int i=1;i<=30;i++) { poww[i]=poww[i-1]*2; if (poww[i]>n) { t=i-1; break; } } for (int i=t;i>=1;i--) { while (poww[i]<=n) { cout<<poww[i]<<" "; n-=poww[i]; if (n==1) { return 0; } } } return 0; }
-
-2
思路是找小于 的最大 ,更新 即可
#include <bits/stdc++.h> using namespace std; int main() { int a; cin >> a; if (a % 2) cout << "-1"; else { for (int i = 1; i < 30; i++) { int b = pow(2, i); if (b > a) { cout << int(pow(2, i - 1)) << " "; a = a - pow(2, i - 1); i = 0; } if (a == 0) { return 0; } } } return 0; }
- 1
信息
- ID
- 121
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 100
- 已通过
- 51
- 上传者