Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <queue>
- #include <utility>
- #include <algorithm>
- using namespace std;
- #define INF 1<<29
- #define SET(a,v) memset(a,v,sizeof(a))
- string s;
- struct node
- {
- int p;
- int j;
- }A[1009],
- child[1009][1009],root;
- int DP[1009][1009];
- bool cmp(node a,node b)
- {
- if(a.p==b.p)return a.j<b.j;
- return a.p>b.p;
- }
- int K,N;
- int func(int pos,int k)
- {
- if(k==K)return 0;
- if(pos>=N)return (-INF);
- if(DP[pos][k]!=INF)return DP[pos][k];
- int a=-INF,b,ans,n=pos;
- if(n & 1)n+=1;
- if(s=="Jan" && k<=n/2 )a=A[pos].j+func(pos+1,k+1);
- else if(s=="Petra" && k<n/2)a=A[pos].j+func(pos+1,k+1);
- //else if(s=="Petra" && )
- b=func(pos+1,k);
- if(a>b)
- {
- ans=a;
- child[pos][k].p=pos+1;
- child[pos][k].j=k+1;
- }
- else
- {
- ans=b;
- child[pos][k].p=pos+1;
- child[pos][k].j=k;
- }
- return DP[pos][k]=ans;
- }
- int vis[1009];
- int main()
- {
- freopen("f.in","r",stdin);
- int T,p,i,j,sum,n;
- //scanf("%d",&T);
- cin>>T;
- while(T--)
- {
- SET(vis,0);
- SET(DP,-1);
- cin>>N;
- cin>>s;
- for(i=0;i<N;i++)scanf("%d%d",&A[i].p,&A[i].j);
- sort(A,A+N,cmp);
- for(i=0;i<N+9;i++)
- {
- for(j=0;j<N+9;j++)child[i][j].p=-1,DP[i][j]=INF;
- }
- int jan;
- int petra;
- root.j=0;
- if(s=="Petra")
- {
- K=N/2;
- jan=func(1,0);
- root.p=1;
- }
- else
- {
- K=N/2;
- if(N & 1)K++;
- jan=func(0,0);
- root.p=1;
- }
- i=root.p;
- j=root.j;
- int r,s;
- while(child[i][j].p!=-1)
- {
- //cout<<i<<" "<<j<<endl;
- if(child[i][j].j!=j)vis[i]=1;
- r=i;
- s=j;
- i=child[r][s].p;
- j=child[r][s].j;
- }
- petra=0;
- for(i=0;i<N;i++)
- {
- if(!vis[i])petra+=A[i].p;
- }
- cout<<petra<<" "<<jan<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement