zoukankan      html  css  js  c++  java
  • 【编程练习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<<")= "<<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<<")= "<<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<<"]= "<<M[1]<<endl;
    12. //cout<<"M["<<2<<"]= "<<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<<"]= "<<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<<" ";
    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<<" ";
    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<<" ";
    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. }




  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/icurious/p/6082442.html
Copyright © 2011-2022 走看看