[关闭]
@Alpacadh 2019-02-23T16:23:19.000000Z 字数 3644 阅读 667

D、E、F

dp


D - A Spy in the Metro

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string.h>
  7. #include<stdio.h>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. using namespace std;
  11. const int inf=0x3f3f3f3f;
  12. const int N=250+5;
  13. const double eps=1e-4;
  14. typedef long long ll;
  15. typedef pair<int,ll> pil;
  16. int dp[N][N];
  17. int t[N];
  18. bool h[2*N][N][2];
  19. int main()
  20. {
  21. int n;
  22. int tot=1;
  23. while(~scanf("%d",&n))
  24. {
  25. if(n==0)
  26. break;
  27. int T;
  28. memset(h,0,sizeof(h));
  29. memset(t,0,sizeof(t));
  30. memset(dp,0,sizeof(dp));
  31. scanf("%d",&T);
  32. for(int i=1;i<n;i++)
  33. dp[T][i]=inf;
  34. dp[T][n]=0;
  35. for(int i=1;i<n;i++)
  36. scanf("%d",&t[i]);
  37. int tep,m1,m2;
  38. scanf("%d",&m1);
  39. for(int i=1;i<=m1;i++)
  40. {
  41. scanf("%d",&tep);
  42. for(int j=1;j<=n;j++)
  43. {
  44. h[tep][j][0]=1;
  45. tep+=t[j];
  46. }
  47. }
  48. scanf("%d",&m2);
  49. for(int i=1;i<=m2;i++)
  50. {
  51. scanf("%d",&tep);
  52. for(int j=n;j>=1;j--)
  53. {
  54. h[tep][j][1]=1;
  55. tep+=t[j-1];
  56. }
  57. }
  58. for(int i=T-1;i>=0;i--)
  59. {
  60. for(int j=1;j<=n;j++)
  61. {
  62. dp[i][j]=dp[i+1][j]+1;
  63. if(j<n&&i+t[j]<=T&&h[i][j][0])
  64. dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);
  65. if(j>1&&i+t[j-1]<=T&&h[i][j][1])
  66. dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);
  67. }
  68. }
  69. printf("Case Number %d: ",tot++);
  70. if(dp[0][1]>=inf)
  71. printf("impossible\n");
  72. else
  73. printf("%d\n",dp[0][1]);
  74. }
  75. return 0;
  76. }

E - The Tower of Babylon

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string.h>
  7. #include<stdio.h>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. using namespace std;
  11. const int inf=0x3f3f3f3f;
  12. const int N=250+5;
  13. const double eps=1e-4;
  14. typedef long long ll;
  15. typedef pair<int,ll> pil;
  16. int dp[N];
  17. struct po
  18. {
  19. int x,y,z;
  20. }p[N];
  21. bool cmp(po a,po b)
  22. {
  23. return a.x*b.y<b.x*b.y;
  24. }
  25. int cnt;
  26. void add(int x,int y,int z)
  27. {
  28. p[cnt].x=x;
  29. p[cnt].y=y;
  30. p[cnt++].z=z;
  31. p[cnt].x=x;
  32. p[cnt].y=z;
  33. p[cnt++].z=y;
  34. p[cnt].x=y;
  35. p[cnt].y=x;
  36. p[cnt++].z=z;
  37. p[cnt].x=y;
  38. p[cnt].y=z;
  39. p[cnt++].z=x;
  40. p[cnt].x=z;
  41. p[cnt].y=x;
  42. p[cnt++].z=y;
  43. p[cnt].x=z;
  44. p[cnt].y=y;
  45. p[cnt++].z=x;
  46. }
  47. int main()
  48. {
  49. int tot=1;
  50. int n;
  51. while(scanf("%d",&n))
  52. {
  53. if(n==0)
  54. break;
  55. cnt=0;
  56. for(int i=0;i<n;i++)
  57. {
  58. int x,y,z;
  59. scanf("%d%d%d",&x,&y,&z);
  60. add(x,y,z);
  61. }
  62. sort(p,p+cnt,cmp);
  63. memset(dp,0,sizeof(dp));
  64. int ma=-inf;
  65. for(int i=0;i<cnt;i++)
  66. {
  67. dp[i]=p[i].z;
  68. for(int j=0;j<i;j++)
  69. {
  70. if(p[i].x>p[j].x&&p[i].y>p[j].y)
  71. dp[i]=max(dp[i],dp[j]+p[i].z);
  72. }
  73. ma=max(ma,dp[i]);
  74. }
  75. printf("Case %d: maximum height = %d\n",tot++,ma);
  76. }
  77. return 0;
  78. }

F - Unidirectional TSP

题意:

解题思路:

代码:

  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string.h>
  7. #include<stdio.h>
  8. #include<cstdlib>
  9. #include<cstdio>
  10. using namespace std;
  11. const int inf=0x3f3f3f3f;
  12. const int N=200+5;
  13. const double eps=1e-4;
  14. typedef long long ll;
  15. typedef pair<int,ll> pil;
  16. int dp[N][N];
  17. int a[N][N];
  18. int path[N][N];
  19. int main()
  20. {
  21. int n,m;
  22. while(~scanf("%d%d",&n,&m))
  23. {
  24. int ans=inf;
  25. memset(a,0,sizeof(a));
  26. for(int i=1;i<=n;i++)
  27. {
  28. for(int j=1;j<=m;j++)
  29. {
  30. scanf("%d",&a[i][j]);
  31. }
  32. }
  33. memset(dp,inf,sizeof(dp));
  34. for(int i=1;i<=n;i++)
  35. dp[i][m]=a[i][m];
  36. for(int i=m;i>=2;i--)
  37. {
  38. for(int j=1;j<=n;j++)
  39. {
  40. int rows[3]={j-1,j,j+1};
  41. if(j==1)
  42. rows[0]=n;
  43. else if(j==n)
  44. rows[2]=1;
  45. sort(rows,rows+3);
  46. for(int k=0;k<3;k++)
  47. {
  48. int temp=dp[j][i]+a[rows[k]][i-1];
  49. if(temp<dp[rows[k]][i-1])
  50. {
  51. dp[rows[k]][i-1]=temp;
  52. path[rows[k]][i-1]=j;
  53. }
  54. }
  55. }
  56. }
  57. int cnt;
  58. for(int i=1;i<=n;i++)
  59. {
  60. if(dp[i][1]<ans)
  61. ans=dp[i][1],cnt=i;
  62. }
  63. printf("%d",cnt);
  64. for(int j=1,i=path[cnt][j];j<m;j++,i=path[i][j])
  65. printf(" %d",i);
  66. printf("\n");
  67. printf("%d\n",ans);
  68. }
  69. return 0;
  70. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注