@hhzhhzhhz
2019-01-18T15:25:29.000000Z
字数 1883
阅读 347
19 1.18
##题一:波浪数
- 题面:![]()
- 算法分析:
规律题,波浪数数字个数为
字典序最小的波浪数为:第一位不动,第二位与第三位互换,第三位与第四位互换···以此类推。
#include<bits/stdc++.h>using namespace std;int main() {int n;int a[20000];cin>>n;cout<<n-2<<endl;cout<<"1 ";for(int i=1; i<=n; i++) {a[i]=i;}if(n%2==0) {for(int i=2; i<n-1; i+=2) {swap(a[i],a[i+1]);}for(int i=2; i<n; i++)cout<<a[i]<<" ";cout<<n;} else {for(int i=2; i<=n; i+=2) {swap(a[i],a[i+1]);}for(int i=2; i<n; i++)cout<<a[i]<<" ";cout<<n-1;}return 0;}
- 题面:
![]()
- 算法分析:
- 由八进制正整数小于等于1000位可得需要用数组模拟;
- 从八进制到十六进制,可通过二进制作为桥梁;
- 八转二 1换3 二转十六 4换1;
- 注意处理前导0。
#include<bits/stdc++.h>#include<string>using namespace std;int ei[1010],tw[3030],si[1010];//ei八进制 tw二进制 si十六进制;int main() {string n;int len=0;cin>>n;cout<<"("<<n<<")8=(";len=n.length();for(int i=0; i<len; i++) {ei[len-i-1]=n[i]-'0';}int t=3*len-1;for(int i=0; i<len; i++) {tw[t]=ei[i]%2;ei[i]/=2;t--;tw[t]=ei[i]%2;ei[i]/=2;t--;tw[t]=ei[i]%2;ei[i]/=2;t--;}int p=1;int q=3*len-1;while(q>=0) {si[p]+=tw[q];q--;si[p]+=tw[q]*2;q--;si[p]+=tw[q]*4;q--;si[p]+=tw[q]*8;q--;p++;}int fg=1;//输出标记for(int i=p-1; i>0; i--) {if(fg==0) {if(si[i]<10) cout<<si[i];if(si[i]==10)cout<<"A";if(si[i]==11)cout<<"B";if(si[i]==12)cout<<"C";if(si[i]==13)cout<<"D";if(si[i]==14)cout<<"E";if(si[i]==15)cout<<"F";}if(fg==1 ) {if(si[i]!=0) {if(si[i]<10) cout<<si[i];if(si[i]==10)cout<<"A";if(si[i]==11)cout<<"B";if(si[i]==12)cout<<"C";if(si[i]==13)cout<<"D";if(si[i]==14)cout<<"E";if(si[i]==15)cout<<"F";fg=0;}}}cout<<")16";return 0;}
- 题面:
![]()
- 算法分析:
DP题,以f[i][j]表示前i根筷子选出j双的最小值;易知,选筷子因选择最接近的两只,故先排序。
#include<bits/stdc++.h>using namespace std;int ch[200];int n,k,b;int ans=0;int f[200][55];int main() {cin>>n>>k;k+=3;for(int i=1; i<=n; i++) {cin>>ch[i];}if(n<2*k) {cout<<"-1";return 0;}for(int i=0; i<200; i++)for(int j=0; j<55; j++) {f[i][j]=124123431;}f[0][0]=0;sort(ch+1,ch+1+n);for(int i=1; i<=n; i++)for(int j=1; j<=min(i/2,k); j++) {//两只为一双f[i][j]=min(f[i-1][j],f[i-2][j-1]+(ch[i]-ch[i-1])*(ch[i]-ch[i-1]));}cout<<f[n][k];}