【编程练习2】

B 窗前的树

  1. #include <iostream>
  2. #define MAXSIZE 10005
  3. using namespace std;
  4. int main()
  5. {
  6. int L,M;
  7. int t[MAXSIZE]={0};
  8. while(cin>>L>>M)
  9. {
  10. int lo,hi;
  11. while(M--)
  12. {
  13. cin>>lo>>hi;
  14. for(int i=lo;i<=hi;i++)
  15. t[i]=1;
  16. }
  17. int count=0;
  18. for(int j=0;j<MAXSIZE;j++)
  19. {
  20. if(t[j]==1)count++;
  21. }
  22. cout<<L-count+1<<endl;
  23. for(int k=0;k<MAXSIZE;k++)
  24. {
  25. t[k]=0;
  26. }
  27. }
  28. return 0;
  29. }

C 一个递归方程

  1. (递归版)超时、超内存
  2. #include <iostream>
  3. using namespace std;
  4. long f(int A,int B,int n)
  5. {
  6. //long f=1,g=1;//定义fun(0),和fun(1)
  7. if (n==1||n==2)
  8. {
  9. return 1;
  10. }
  11. else return (A*f(A,B,n-1)+B*f(A,B,n-2))%7;
  12. }
  13. int main()
  14. {
  15. int A,B,n;
  16. while((cin>>A>>B>>n)&&!(A==0&&B==0&&n==0))
  17. {
  18. for(int i=1;i<=n;i++)
  19. cout<<"f("<<i<<")=\t\t\t"<<f(A,B,i)<<endl;
  20. }
  21. return 0;
  22. }
  1. (迭代版)
  2. 尝试用迭代代替递归,而最终理论和实践证明不可行
  3. #include <iostream>
  4. using namespace std;
  5. __int64 f_I(int A,int B,int n)
  6. {
  7. __int64 f=1,g=1;//定义fun(0),和fun(1)
  8. while(2<n--)
  9. {
  10. g=(A*g+B*f)%7;
  11. f=((g+A*f)/B);
  12. cout<<"g="<<g<<", f="<<f<<endl;
  13. }
  14. return g;
  15. }
  16. int main()
  17. {
  18. int A,B,n;
  19. while((cin>>A>>B>>n)&&!(A==0&&B==0&&n==0))
  20. {
  21. if(n<=0)break;
  22. for(int i=1;i<n;i++)
  23. {cout<<"f("<<i<<")=\t\t\t"<<f_I(A,B,i)<<endl;}
  24. }
  25. return 0;
  26. }

!(找规律)[
]

  1. #include <iostream>
  2. #define MSIZE 100
  3. using namespace std;
  4. int main()
  5. {
  6. int A,B,n,i;
  7. int M[MSIZE];
  8. M[1]=1;M[2]=1;
  9. while((cin>>A>>B>>n)&&!(A==0&&B==0&&n==0))
  10. {
  11. //cout<<"M["<<1<<"]=\t\t\t"<<M[1]<<endl;
  12. //cout<<"M["<<2<<"]=\t\t\t"<<M[2]<<endl;
  13. for(i=3;i<MSIZE;i++)
  14. {
  15. M[i]=(A*M[i-1]+B*M[i-2])%7;
  16. //cout<<"M["<<i<<"]=\t\t\t"<<M[i]<<endl;
  17. if (M[i]==1&&M[i-1]==1)
  18. {
  19. break;
  20. }
  21. }
  22. int index=n%(i-2);
  23. if(index==0)cout<<M[i-2]<<endl;
  24. else cout<<M[index]<<endl;
  25. }
  26. return 0;
  27. }

最长字段和

  1. (简易版)
  2. #include <iostream>
  3. #include <cstdio>
  4. #include "maxsum.h"
  5. #define MAXN 10001
  6. #define GET_LEN(ARRAY,LEN) {LEN = (sizeof(ARRAY) / sizeof(ARRAY[0]));}
  7. int a[MAXN];
  8. int maxsum(int );
  9. int maxsum(int ,int &a,int &b);
  10. using namespace std;
  11. int main()
  12. {
  13. int T,i;
  14. cin>>T;
  15. int n;
  16. int lo=0,hi=0;
  17. for(int k=1;k<=T;k++)
  18. {
  19. cin>>n;
  20. for(i=0;i<n;i++)
  21. {
  22. cin>>a[i];
  23. }
  24. //cout<<maxsum(n)<<endl;
  25. cout<<"Case "<<k<<":"<<endl;
  26. cout<<maxsum(n,lo,hi)<<" "<<lo+1<<" "<<hi+1<<"\n\n";
  27. for(i=0;i<n;i++)
  28. {
  29. a[i]=0;
  30. }
  31. lo=0,hi=0;
  32. }
  33. return 0;
  34. }
  35. int maxsum(int n,int &besti,int &bestj){
  36. int sum=0;
  37. int b=0;
  38. int begin=0;
  39. for(int i=0;i<=n;i++){
  40. if(b>0)b+=a[i];
  41. else {
  42. b=a[i];
  43. begin=i;
  44. }
  45. if(b>sum)
  46. {
  47. sum=b;
  48. besti=begin;
  49. bestj=i;
  50. }
  51. }
  52. return sum;
  53. }
  54. /*
  55. int maxsum(int n)
  56. {
  57. int ma=0;
  58. int sum=0;
  59. int lo,hi;
  60. for(int i=0;i<=n;i++){
  61. if(sum>0)
  62. {
  63. sum+=a[i];
  64. }
  65. else
  66. {
  67. sum=a[i];
  68. }
  69. if(sum>ma)
  70. {
  71. ma=sum;
  72. }
  73. }
  74. return sum;
  75. }*/
  1. (动态规划版)
  2. #include <iostream>
  3. #include <cstdio>
  4. //#include "maxsum.h"
  5. #define MAXN 10001
  6. #define GET_LEN(ARRAY,LEN) {LEN = (sizeof(ARRAY) / sizeof(ARRAY[0]));}
  7. int a[MAXN];
  8. int maxsum(int );
  9. int maxsum(int ,int &a,int &b);
  10. using namespace std;
  11. int main()
  12. {
  13. int T,i;
  14. cin>>T;
  15. int n;
  16. int lo=0,hi=0;
  17. for(int k=1;k<=T;k++)
  18. {
  19. cin>>n;
  20. for(i=0;i<n;i++)
  21. {
  22. cin>>a[i];
  23. }
  24. //cout<<maxsum(n)<<endl;
  25. cout<<"Case "<<k<<":"<<endl;
  26. cout<<maxsum(n,lo,hi)<<" ";cout<<lo+1<<" "<<hi+1<<"\n\n";
  27. for(i=0;i<n;i++)
  28. {
  29. a[i]=0;
  30. }
  31. lo=0,hi=0;
  32. }
  33. return 0;
  34. }
  35. int maxsum(int n,int &besti,int &bestj){
  36. int sum=0;
  37. int b=0;
  38. int begin=0;
  39. for(int i=0;i<=n;i++){
  40. if(b>0){b+=a[i];}
  41. else {//b<=0
  42. b=a[i];
  43. if(b<0)
  44. begin=i;
  45. //cout<<"begin="<<begin<<", b="<<b<<endl;
  46. }
  47. if(b>sum)
  48. {
  49. sum=b;
  50. besti=begin;
  51. bestj=i;
  52. //cout<<"lo="<<besti<<", hi="<<bestj<<endl;
  53. }
  54. }
  55. return sum;
  56. }
  57. /*
  58. int maxsum(int n)
  59. {
  60. int ma=0;
  61. int sum=0;
  62. int lo,hi;
  63. for(int i=0;i<=n;i++){
  64. if(sum>0)
  65. {
  66. sum+=a[i];
  67. }
  68. else
  69. {
  70. sum=a[i];
  71. }
  72. if(sum>ma)
  73. {
  74. ma=sum;
  75. }
  76. }
  77. return sum;
  78. }*/
  1. (傻瓜都懂法)
  2. #include <iostream>
  3. using namespace std;
  4. #define MAXN 100005
  5. int main()
  6. {
  7. int T,n,i;
  8. int a[MAXN],index[MAXN];
  9. int max,lo,hi,ca;
  10. cin>>T;
  11. for(ca=1;ca<=T;ca++)
  12. {
  13. cin>>n;
  14. for(i=1; i<=n; i++)
  15. {
  16. cin>>a[i];
  17. index[i]=i;
  18. }
  19. max=a[1];
  20. lo=1;
  21. hi=1;
  22. for(i=2; i<=n; i++)
  23. {
  24. if(a[i-1]>=0)
  25. {
  26. a[i]+=a[i-1];
  27. index[i]=index[i-1];
  28. }
  29. if(a[i]>max)
  30. {
  31. max=a[i];
  32. hi=i;
  33. }
  34. }
  35. cout<<"Case "<<ca<<":"<<endl;
  36. cout<<max<<" "<<index[hi]<<" "<<hi<<"\n\n";
  37. }
  38. return 0;
  39. }

(AC)

  1. #include <iostream>
  2. #include <string.h>
  3. #define MAXN 10005
  4. #define GET_LEN(ARRAY,LEN) {LEN = (sizeof(ARRAY) / sizeof(ARRAY[0]));}
  5. using namespace std;
  6. char ch[MAXN];
  7. int dp[MAXN];
  8. int main()
  9. {
  10. int T;cin>>T;while(T--)
  11. {
  12. cin>>ch;
  13. int len=strlen(ch);
  14. //GET_LEN(ch,len)
  15. //cout<<"len="<<len<<endl;
  16. for(int i=0;i<len;i++){
  17. dp[i]=1;//平凡的情况,最优解为1
  18. }
  19. for(int i=len-2;i>=0;i--){//定义两个游标i,j
  20. for(int j=i+1;j<len;j++){
  21. if(ch[i]>ch[j]&&dp[i]<dp[j]+1) //>表示降序,<表示升序
  22. {
  23. dp[i]=dp[j]+1;//每当遇见一个就加1
  24. }
  25. }
  26. }
  27. int max=0;
  28. for(int k=0;k<len;k++)
  29. {
  30. if(max<dp[k])
  31. {
  32. max=dp[k];
  33. }
  34. }
  35. cout<<max<<endl;
  36. }
  37. return 0;
  38. }

E Card move

  1. (AC)
  2. #include <iostream>
  3. #include <string.h>
  4. #define MAXN 10005
  5. #define GET_LEN(ARRAY,LEN) {LEN = (sizeof(ARRAY) / sizeof(ARRAY[0]));}
  6. using namespace std;
  7. int ch[MAXN];
  8. int dp[MAXN];
  9. int main()
  10. {
  11. int i,j,k;
  12. int T;cin>>T;while(T--)
  13. {
  14. int len=0;
  15. cin>>len;
  16. for(i=0;i<len;i++)
  17. cin>>ch[i];
  18. //int len=strlen(ch);
  19. //GET_LEN(ch,len)
  20. //cout<<"len="<<len<<endl;
  21. for(k=0;k<len;k++){
  22. dp[k]=1;//平凡的情况,最优解为1
  23. }
  24. for(i=len-2;i>=0;i--){//定义两个游标i,j
  25. for(j=i+1;j<len;j++){
  26. if(!(ch[i]>ch[j])&&dp[i]<dp[j]+1) //>表示降序,<表示升序
  27. {
  28. dp[i]=dp[j]+1;//每当遇见一个就加1
  29. }
  30. }
  31. }
  32. int max=0;
  33. for(k=0;k<len;k++)
  34. {
  35. //cout<<"dp["<<k<<"]="<<dp[k]<<endl;
  36. if(max<dp[k])
  37. {
  38. max=dp[k];
  39. }
  40. }
  41. //cout<<max<<endl;
  42. //cout<<"move :"<<len-max<<" times"<<endl;
  43. cout<<len-max<<endl;
  44. }
  45. return 0;
  46. }

H

  1. (动态规划后进行分割累加版) WA
  2. #include <iostream>
  3. #include <string.h>
  4. #define MAXN 10005
  5. #define GET_LEN(ARRAY,LEN) {LEN = (sizeof(ARRAY) / sizeof(ARRAY[0]));}
  6. using namespace std;
  7. long fun(int n)//求n的阶乘
  8. {
  9. long ans=1;
  10. for(int i=1;i<=n;i++)
  11. ans*=i;
  12. cout<<n<<"的阶乘为"<<ans<<endl;
  13. return ans;
  14. }
  15. long fun(int hi,int lo)
  16. {
  17. long ans=1;
  18. for(int i=hi;i>=lo+1;i--)
  19. ans*=i;
  20. cout<<hi<<"中取"<<lo<<"的排列为"<<ans<<endl;
  21. return ans;
  22. }
  23. long per(int m,int n)//求m个元素中取n个的组合数
  24. {
  25. long ans=0;
  26. if(m>=n){
  27. if(m==n)return 1;
  28. if(n==1||n==(m-1)) return m;
  29. if(n==2||(n==(m-2)))return m*(m-1)/2;
  30. ans=fun(m,n)/fun(m-n);
  31. cout<<"select "<<n<<" from "<<m<<" have "<<ans<<" measures"<<endl;
  32. }
  33. return ans;
  34. }
  35. int ch[MAXN];
  36. int dp[MAXN];
  37. int main()
  38. {
  39. int i,j,k,l,r;
  40. // cin>>i>>j;cout<<per(i,j)<<endl;
  41. int T;cin>>T;
  42. while(T--)
  43. {
  44. int len=0;
  45. cin>>len;
  46. int m=0;cin>>m;
  47. for(i=0;i<len;i++)
  48. cin>>ch[i];
  49. //int len=strlen(ch);
  50. //GET_LEN(ch,len)
  51. //cout<<"len="<<len<<endl;
  52. for(k=0;k<len;k++){
  53. dp[k]=1;//平凡的情况,最优解为1
  54. }
  55. for(i=len-2;i>=0;i--){//定义两个游标i,j
  56. for(j=i+1;j<len;j++){
  57. if(ch[i]<ch[j]&&dp[i]<dp[j]+1) //>表示降序,<表示升序
  58. {
  59. dp[i]=dp[j]+1;//每当遇见一个就加1
  60. }
  61. }
  62. }
  63. int max=0;
  64. for(k=0;k<len;k++)
  65. {
  66. //cout<<"dp["<<k<<"]="<<dp[k]<<endl;
  67. if(max<dp[k])
  68. {
  69. max=dp[k];
  70. }
  71. }
  72. //cout<<max<<endl;
  73. int sum=0;
  74. if (m==1){
  75. sum=len;
  76. }
  77. else{
  78. for(l=len-2,r=len-1;l>=0;l--,r--)
  79. {
  80. if(dp[l]<dp[r])//出现节点
  81. {
  82. if (dp[r]>=m)
  83. {
  84. sum+=per(dp[r],m);
  85. //cout<<"sum="<<sum<<endl;
  86. }
  87. }
  88. if(l==0)
  89. {
  90. if (dp[l]>=m){
  91. sum+=per(dp[l],m);
  92. //cout<<"sum="<<sum<<endl;
  93. }
  94. }
  95. }
  96. }
  97. //cout<<"final="<<sum<<endl;
  98. cout<<sum<<endl;
  99. //cout<<"move :"<<len-max<<" times"<<endl;
  100. //cout<<len-max<<endl;
  101. }
  102. return 0;
  103. }




posted @ 2016-11-20 12:51  iCurious  阅读(221)  评论(0编辑  收藏  举报