[关闭]
@hhzhhzhhz 2019-01-18T15:25:29.000000Z 字数 1883 阅读 328

2017级测试20190106解题报告

19 1.18


##题一:波浪数
- 题面:此处输入图片的描述
- 算法分析:
规律题,波浪数数字个数为
字典序最小的波浪数为:第一位不动,第二位与第三位互换,第三位与第四位互换···以此类推。

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. int n;
  5. int a[20000];
  6. cin>>n;
  7. cout<<n-2<<endl;
  8. cout<<"1 ";
  9. for(int i=1; i<=n; i++) {
  10. a[i]=i;
  11. }
  12. if(n%2==0) {
  13. for(int i=2; i<n-1; i+=2) {
  14. swap(a[i],a[i+1]);
  15. }
  16. for(int i=2; i<n; i++)
  17. cout<<a[i]<<" ";
  18. cout<<n;
  19. } else {
  20. for(int i=2; i<=n; i+=2) {
  21. swap(a[i],a[i+1]);
  22. }
  23. for(int i=2; i<n; i++)
  24. cout<<a[i]<<" ";
  25. cout<<n-1;
  26. }
  27. return 0;
  28. }

题二:进制转换(八进制转十六进制)

  • 题面:
    此处输入图片的描述
  • 算法分析:
    1. 由八进制正整数小于等于1000位可得需要用数组模拟;
    2. 从八进制到十六进制,可通过二进制作为桥梁;
    3. 八转二 1换3 二转十六 4换1;
    4. 注意处理前导0。

AC代码

  1. #include<bits/stdc++.h>
  2. #include<string>
  3. using namespace std;
  4. int ei[1010],tw[3030],si[1010];//ei八进制 tw二进制 si十六进制;
  5. int main() {
  6. string n;
  7. int len=0;
  8. cin>>n;
  9. cout<<"("<<n<<")8=(";
  10. len=n.length();
  11. for(int i=0; i<len; i++) {
  12. ei[len-i-1]=n[i]-'0';
  13. }
  14. int t=3*len-1;
  15. for(int i=0; i<len; i++) {
  16. tw[t]=ei[i]%2;
  17. ei[i]/=2;
  18. t--;
  19. tw[t]=ei[i]%2;
  20. ei[i]/=2;
  21. t--;
  22. tw[t]=ei[i]%2;
  23. ei[i]/=2;
  24. t--;
  25. }
  26. int p=1;
  27. int q=3*len-1;
  28. while(q>=0) {
  29. si[p]+=tw[q];
  30. q--;
  31. si[p]+=tw[q]*2;
  32. q--;
  33. si[p]+=tw[q]*4;
  34. q--;
  35. si[p]+=tw[q]*8;
  36. q--;
  37. p++;
  38. }
  39. int fg=1;//输出标记
  40. for(int i=p-1; i>0; i--) {
  41. if(fg==0) {
  42. if(si[i]<10) cout<<si[i];
  43. if(si[i]==10)cout<<"A";
  44. if(si[i]==11)cout<<"B";
  45. if(si[i]==12)cout<<"C";
  46. if(si[i]==13)cout<<"D";
  47. if(si[i]==14)cout<<"E";
  48. if(si[i]==15)cout<<"F";
  49. }
  50. if(fg==1 ) {
  51. if(si[i]!=0) {
  52. if(si[i]<10) cout<<si[i];
  53. if(si[i]==10)cout<<"A";
  54. if(si[i]==11)cout<<"B";
  55. if(si[i]==12)cout<<"C";
  56. if(si[i]==13)cout<<"D";
  57. if(si[i]==14)cout<<"E";
  58. if(si[i]==15)cout<<"F";
  59. fg=0;
  60. }
  61. }
  62. }
  63. cout<<")16";
  64. return 0;
  65. }

题三:万圣节的游戏

此处输入图片的描述

题四:筷子

  • 题面:
    此处输入图片的描述
    此处输入图片的描述
  • 算法分析:
    DP题,以f[i][j]表示前i根筷子选出j双的最小值;易知,选筷子因选择最接近的两只,故先排序。

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int ch[200];
  4. int n,k,b;
  5. int ans=0;
  6. int f[200][55];
  7. int main() {
  8. cin>>n>>k;
  9. k+=3;
  10. for(int i=1; i<=n; i++) {
  11. cin>>ch[i];
  12. }
  13. if(n<2*k) {
  14. cout<<"-1";
  15. return 0;
  16. }
  17. for(int i=0; i<200; i++)
  18. for(int j=0; j<55; j++) {
  19. f[i][j]=124123431;
  20. }
  21. f[0][0]=0;
  22. sort(ch+1,ch+1+n);
  23. for(int i=1; i<=n; i++)
  24. for(int j=1; j<=min(i/2,k); j++) {//两只为一双
  25. f[i][j]=min(f[i-1][j],f[i-2][j-1]+(ch[i]-ch[i-1])*(ch[i]-ch[i-1]));
  26. }
  27. cout<<f[n][k];
  28. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注