比赛 20160415 评测结果 AAAWWWWWWW
题目名称 能量网络 最终得分 30
用户昵称 debug 运行时间 0.443 s
代码语言 C++ 内存使用 0.95 MiB
提交时间 2016-04-15 09:39:23
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. int n,m;int ans=1234567898;
  4. int weizhi[1111]={};int shuliang[1111]={};
  5. struct ff{int x,y;}f[55555]={};int e[55555]={};ff g[1111]={};
  6. int a[1111]={};int b[1111]={};bool vis[1111]={};
  7. bool cmpp(ff m,ff n){return m.x<n.x;}
  8. void slove1()
  9. {
  10. ans=0;
  11. for(int i=1;i<=n;i++)
  12. {
  13. int maxx=0;
  14. for(int j=weizhi[i];j<weizhi[i+1];j++)
  15. if(a[e[j]]>maxx)
  16. maxx=a[e[j]];
  17. ans+=maxx;
  18. }
  19. for(int i=1;i<=n;i++)
  20. g[i].x=b[i],g[i].y=i;
  21. std::sort(g+1,g+1+n,cmpp);
  22. int te=0;
  23. for(int ii=1;ii<=n;ii++)
  24. {
  25. te+=g[ii].x;vis[g[ii].y]=1;
  26. int temp=0;
  27. for(int i=1;i<=n;i++)
  28. {
  29. int maxx=0;
  30. for(int j=weizhi[i];j<weizhi[i+1];j++)
  31. if(!vis[e[j]]&&a[e[j]]>maxx)
  32. maxx=a[e[j]];
  33. temp+=maxx;
  34. }
  35. temp+=te;
  36. if(temp<ans)
  37. ans=temp;
  38. }
  39. printf("%d\n",ans);
  40. }
  41. void check()
  42. {
  43. int temp=0;
  44. for(int i=1;i<=n;i++)
  45. {
  46. int maxx=0;
  47. for(int j=weizhi[i];j<weizhi[i+1];j++)
  48. if(!vis[e[j]]&&a[e[j]]>maxx)
  49. maxx=a[e[j]];
  50. temp+=maxx;
  51. }
  52. for(int i=1;i<=n;i++)
  53. if(vis[i])
  54. temp+=b[i];
  55. if(temp<ans)
  56. ans=temp;
  57. }
  58. void dfs(int a)
  59. {
  60. if(a>n){check();return;}
  61. vis[a]=1;dfs(a+1);
  62. vis[a]=0;dfs(a+1);
  63. }
  64. int main()
  65. {
  66. freopen("energynet.in","r",stdin);
  67. freopen("energynet.out","w",stdout);
  68. scanf("%d%d",&n,&m);
  69. for(int i=1;i<=n;i++)
  70. scanf("%d",&a[i]);
  71. for(int i=1;i<=n;i++)
  72. scanf("%d",&b[i]);
  73. for(int i=1;i<=m;i++)
  74. scanf("%d%d",&f[i].x,&f[i].y),shuliang[f[i].x]++;
  75. for(int i=1;i<=n+1;i++)
  76. weizhi[i]=weizhi[i-1]+shuliang[i-1];
  77. for(int i=1;i<=m;i++)
  78. e[weizhi[f[i].x]]=f[i].y,weizhi[f[i].x]++;
  79. for(int i=n+1;i>0;i--)
  80. weizhi[i]=weizhi[i-1];
  81. if(n>23){
  82. slove1();return 0;}
  83. dfs(1);
  84. printf("%d\n",ans);
  85. return 0;
  86. }