比赛 202103省实验桐柏一中普及组联赛 评测结果 AAAAAAAAAA
题目名称 自助者天助 最终得分 100
用户昵称 yrtiop 运行时间 0.289 s
代码语言 C++ 内存使用 7.07 MiB
提交时间 2021-03-22 19:55:57
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 30005;
  6. int f[maxn];
  7. int n,m;
  8. int rk[maxn],v[maxn],w[maxn];
  9. int w1[maxn],v1[maxn],num[maxn],sum = 0;
  10. int W[maxn << 5],V[maxn << 5];
  11. bool cmp(int a,int b) {
  12. return v[a] == v[b] ? w[a] < w[b] : v[a] < v[b];
  13. }
  14. int main() {
  15. freopen("delicious.in","r",stdin);
  16. freopen("delicious.out","w",stdout);
  17. scanf("%d%d",&n,&m);
  18. for(int i = 1;i <= n;++ i) {
  19. scanf("%d%d",&w[i],&v[i]);
  20. rk[i] = i;
  21. }
  22. sort(rk + 1 , rk + 1 + n , cmp);
  23. for(int i = 1;i <= n;++ i) {
  24. int t = rk[i],s = rk[i - 1];
  25. if(v[s] != v[t]||w[s] != w[t]) {
  26. v1[++ sum] = v[t];
  27. w1[sum] = w[t];
  28. num[sum] = 1;
  29. }
  30. else {
  31. ++ num[sum];
  32. }
  33. }
  34. int cnt = 0;
  35. for(int i = 1;i <= sum;++ i) {
  36. int y = num[i],s = 1;
  37. while(y >= s) {
  38. V[++ cnt] = v1[i] * s;
  39. W[cnt] = w1[i] * s;
  40. y -= s;
  41. s <<= 1;
  42. }
  43. V[++ cnt] = v1[i] * y;
  44. W[cnt] = w1[i] * y;
  45. }
  46. for(int i = 1;i <= cnt;++ i) {
  47. for(int j = m;j >= W[i];-- j) {
  48. f[j] = max(f[j] , f[j - W[i]] + V[i]);
  49. }
  50. }
  51. printf("%d",f[m]);
  52. fclose(stdin);
  53. fclose(stdout);
  54. return 0;
  55. }