Advertisement
farsid

Untitled

Apr 15th, 2013
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <stack>
  8. #include <queue>
  9. #include <utility>
  10. #include <algorithm>
  11. using namespace std;
  12. #define INF 1<<29
  13. #define SET(a,v) memset(a,v,sizeof(a))
  14.  
  15. string s;
  16.  
  17. struct node
  18. {
  19. int p;
  20. int j;
  21. }A[1009],
  22. child[1009][1009],root;
  23. int DP[1009][1009];
  24. bool cmp(node a,node b)
  25. {
  26. if(a.p==b.p)return a.j<b.j;
  27. return a.p>b.p;
  28. }
  29. int K,N;
  30.  
  31. int func(int pos,int k)
  32. {
  33. if(k==K)return 0;
  34. if(pos>=N)return (-INF);
  35.  
  36. if(DP[pos][k]!=INF)return DP[pos][k];
  37.  
  38. int a=-INF,b,ans,n=pos;
  39. if(n & 1)n+=1;
  40. if(s=="Jan" && k<=n/2 )a=A[pos].j+func(pos+1,k+1);
  41. else if(s=="Petra" && k<n/2)a=A[pos].j+func(pos+1,k+1);
  42. //else if(s=="Petra" && )
  43. b=func(pos+1,k);
  44. if(a>b)
  45. {
  46. ans=a;
  47. child[pos][k].p=pos+1;
  48. child[pos][k].j=k+1;
  49. }
  50. else
  51. {
  52. ans=b;
  53. child[pos][k].p=pos+1;
  54. child[pos][k].j=k;
  55. }
  56. return DP[pos][k]=ans;
  57. }
  58.  
  59. int vis[1009];
  60.  
  61. int main()
  62. {
  63. freopen("f.in","r",stdin);
  64. int T,p,i,j,sum,n;
  65. //scanf("%d",&T);
  66. cin>>T;
  67. while(T--)
  68. {
  69. SET(vis,0);
  70. SET(DP,-1);
  71. cin>>N;
  72. cin>>s;
  73.  
  74. for(i=0;i<N;i++)scanf("%d%d",&A[i].p,&A[i].j);
  75.  
  76. sort(A,A+N,cmp);
  77.  
  78. for(i=0;i<N+9;i++)
  79. {
  80. for(j=0;j<N+9;j++)child[i][j].p=-1,DP[i][j]=INF;
  81. }
  82.  
  83. int jan;
  84. int petra;
  85. root.j=0;
  86. if(s=="Petra")
  87. {
  88. K=N/2;
  89. jan=func(1,0);
  90. root.p=1;
  91.  
  92. }
  93. else
  94. {
  95. K=N/2;
  96. if(N & 1)K++;
  97. jan=func(0,0);
  98. root.p=1;
  99. }
  100. i=root.p;
  101. j=root.j;
  102. int r,s;
  103. while(child[i][j].p!=-1)
  104. {
  105. //cout<<i<<" "<<j<<endl;
  106. if(child[i][j].j!=j)vis[i]=1;
  107. r=i;
  108. s=j;
  109. i=child[r][s].p;
  110. j=child[r][s].j;
  111. }
  112. petra=0;
  113. for(i=0;i<N;i++)
  114. {
  115. if(!vis[i])petra+=A[i].p;
  116. }
  117. cout<<petra<<" "<<jan<<endl;
  118.  
  119. }
  120. return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement