当前位置:   article > 正文

2017中国大学生程序设计竞赛 - 女生专场【5/10】_2017中国大学生程序设计竞赛 - 女生专场排行榜

2017中国大学生程序设计竞赛 - 女生专场排行榜

A.


B.基础Dp.


设定dp【i】【2】:

①dp【i】【0】表示到位子i不建立糖果厂的最小花费。

②dp【i】【1】表示到位子i建立糖果厂的最小花费。


那么其状态转移方程不难写出:

dp【i】【1】=min(dp【i】【0】+w,dp【i】【1】+w);

dp【i】【0】=min(dp【i】【0】,dp【j】【1】+从j+1到i所有到点j的距离和);

注意初始化要足够大。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define ll __int64
  7. struct node
  8. {
  9. ll x,w;
  10. }a[3005];
  11. ll dp[3005][2];
  12. ll cost[3005][3005];
  13. int cmp(node a,node b)
  14. {
  15. return a.x<b.x;
  16. }
  17. int main()
  18. {
  19. ll n;
  20. while(~scanf("%I64d",&n))
  21. {
  22. memset(cost,0,sizeof(cost));
  23. memset(dp,0,sizeof(dp));
  24. for(ll i=1;i<=n;i++)
  25. {
  26. scanf("%I64d%I64d",&a[i].x,&a[i].w);
  27. }
  28. sort(a+1,a+1+n,cmp);
  29. dp[1][1]=a[1].w;
  30. dp[1][0]=1000000000000000000;
  31. for(ll i=1;i<=n;i++)
  32. {
  33. for(ll j=i+1;j<=n;j++)
  34. {
  35. if(j==i+1)cost[i][j]=a[j].x-a[i].x;
  36. else
  37. cost[i][j]=cost[i][j-1]+a[j].x-a[i].x;
  38. }
  39. }
  40. for(ll i=2;i<=n;i++)
  41. {
  42. ll x=a[i].x;
  43. ll w=a[i].w;
  44. dp[i][1]=1000000000000000000;
  45. dp[i][0]=1000000000000000000;
  46. dp[i][1]=min(dp[i-1][1]+w,dp[i-1][0]+w);
  47. for(ll j=i-1;j>=1;j--)
  48. {
  49. dp[i][0]=min(dp[i][0],dp[j][1]+cost[j][i]);
  50. }
  51. }
  52. printf("%I64d\n",min(dp[n][0],dp[n][1]));
  53. }
  54. }




C.因为只删除一个元素,那么我们对应维护一个前缀Gcd以及后缀Gcd即可。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. using namespace std;
  5. int a[150000];
  6. int pre[150000];
  7. int back[150000];
  8. int gcd(int x,int y)
  9. {
  10. return y==0?x:gcd(y,x%y);
  11. }
  12. int main()
  13. {
  14. int t;
  15. scanf("%d",&t);
  16. while(t--)
  17. {
  18. int n;
  19. scanf("%d",&n);
  20. for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  21. for(int i=1;i<=n;i++)
  22. {
  23. if(i==1)pre[i]=a[i];
  24. else pre[i]=gcd(pre[i-1],a[i]);
  25. }
  26. for(int i=n;i>=1;i--)
  27. {
  28. if(i==n)back[i]=a[i];
  29. else back[i]=gcd(back[i+1],a[i]);
  30. }
  31. int output=max(pre[n-1],back[2]);
  32. for(int i=2;i<=n-1;i++)
  33. {
  34. output=max(output,gcd(pre[i-1],back[i+1]));
  35. }
  36. printf("%d\n",output);
  37. }
  38. }



D.一道蛮套路的最短路相关问题,我是萌萌哒D题题解


E.

F.


G.思维题,只要从后向前扫,1的数量比2的数量多即可。

  1. #include<stdio.h>
  2. #include<string.h>
  3. using namespace std;
  4. int a[150000];
  5. int main()
  6. {
  7. int t;
  8. scanf("%d",&t);
  9. while(t--)
  10. {
  11. int n;
  12. scanf("%d",&n);
  13. for(int i=2;i<=n;i++)
  14. {
  15. scanf("%d",&a[i]);
  16. }
  17. if(n%2==1)
  18. {
  19. printf("No\n");
  20. }
  21. else
  22. {
  23. int flag=0;
  24. int sum=0;
  25. for(int i=n;i>=2;i--)
  26. {
  27. if(a[i]==1)sum++;
  28. else
  29. {
  30. if(sum==0)flag=1;
  31. else sum--;
  32. }
  33. }
  34. if(flag==0)printf("Yes\n");
  35. else printf("No\n");
  36. }
  37. }
  38. }



H.Dp+矩阵快速幂,我是萌萌哒H题题解


I.

J.

K.






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/443300
推荐阅读
  

闽ICP备14008679号