Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * File: main.cpp
- * Author: Hrayr [HarHro94]
- * Problem: acmp.ru
- * IDE: Visual C++ 2010
- */
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <vector>
- #include <cstdio>
- #include <queue>
- #include <set>
- using namespace std;
- const int INF = 0x7FFFFFFF;
- int n, rate, a[1007], b[1007], dp[1007][1007], pred[1007][1007]; // dp[curMan][curCnt] -> max rate
- vector<pair<pair<int, int>, int> > p;
- vector<int> ans, m;
- bool cmp(int i1, int i2);
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- int i, j, ptr, cnt;
- vector<int> tmp;
- cin >> n >> rate;
- for(i=0;i<n;++i)
- {
- cin >> a[i] >> b[i];
- if (b[i]>=0)
- {
- p.push_back(make_pair(make_pair(a[i], b[i]), i));
- }
- else
- {
- m.push_back(i);
- }
- }
- sort(p.begin(), p.end());
- ptr=0;
- while(ptr<(int)p.size() && p[ptr].first.first<=rate)
- {
- rate+=p[ptr].first.second;
- ans.push_back(p[ptr].second+1);
- ++ptr;
- }
- sort(m.begin(), m.end(), cmp);
- cnt=(int)m.size();
- for(i=0;i<=cnt;++i)
- {
- for(j=0;j<=cnt;++j)
- {
- dp[i][j]=-INF;
- }
- }
- for(i=0;i<=cnt;++i)
- {
- dp[i][0]=rate;
- }
- for(i=1;i<=cnt;++i)
- {
- for(j=1;j<=cnt;++j)
- {
- if (dp[i-1][j]!=-INF && dp[i][j]<dp[i-1][j])
- {
- dp[i][j]=dp[i-1][j];
- pred[i][j]=1;
- }
- if (a[m[i-1]]<=dp[i-1][j-1] && dp[i][j]<dp[i-1][j-1]+b[m[i-1]])
- {
- dp[i][j]=dp[i-1][j-1]+b[m[i-1]];
- pred[i][j]=2;
- }
- }
- }
- for(j=0;j<=cnt;++j)
- {
- if (dp[cnt][j]!=-INF)
- {
- i=j;
- }
- }
- j=i;
- i=cnt;
- while(j!=0)
- {
- if (pred[i][j]==2)
- {
- tmp.push_back(m[i-1]+1);
- --j;
- }
- --i;
- }
- reverse(tmp.begin(), tmp.end());
- for(i=0;i<(int)tmp.size();++i)
- {
- ans.push_back(tmp[i]);
- }
- cout << ans.size() << endl;
- for(i=0;i<ans.size();++i)
- {
- cout << ans[i] << " ";
- }
- cout << endl;
- return 0;
- }
- bool cmp(int i1, int i2)
- {
- return a[i1]+b[i1]>a[i2]+b[i2];
- }
Advertisement
Add Comment
Please, Sign In to add comment