数据结构和算法分析10.2-a

https://blog.csdn.net/qq_29617037/article/details/51371460

这篇文章有详细解释

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void Sort(int d[], int p[], int n)
  4. {
  5.     int temp1, temp2;
  6.     for (int i = 1; i <= n; i++)
  7.     {
  8.         for (int j = 1; j <= n - i; j++)
  9.         {
  10.             if (p[j] < p[j + 1])
  11.             {
  12.                 temp1 = p[j];
  13.                 p[j] = p[j + 1];
  14.                 p[j + 1] = temp1;
  15.                 temp2 = d[j];
  16.                 d[j] = d[j + 1];
  17.                 d[j + 1] = temp2;
  18.             }
  19.         }
  20.     }
  21. }
  22. int JS(int *d, int *J, int n,int *p)
  23. {
  24.     int r, k, i, j;
  25.     int sum = 0;
  26.     J[0] = 0;
  27.     J[1] = 1;//将第一个并到J中
  28.     sum = p[1];
  29.     k = 1;
  30.     for (i = 2; i <= n; i++)
  31.     {
  32.         r = k;
  33.         while (r > 0 && d[J[r]] > d[i] && d[J[r]] != r)
  34.         {
  35.             r--;
  36.         }
  37.         if (d[J[r]] <= d[i] && d[i] > r)//最后完成时间大于r则可以插入
  38.         {
  39.             for (j = k; j > r; j--)
  40.             {
  41.                 J[j + 1] = J[j];
  42.             }
  43.             J[r+1] = i;
  44.             sum += p[i];
  45.             k++;
  46.         }
  47.     }
  48.     for (i = 1; i <= k; i++)
  49.     {
  50.         printf("\n%d ", J[i]);
  51.     }
  52.     return sum;
  53. }
  54. int main()
  55. {
  56.     int n;
  57.     scanf("%d", &n);//作业个数
  58.     int *d = (int *)malloc(sizeof(int)*n);//时间数组d
  59.     int *p = (int *)malloc(sizeof(int)*n);//收益数组p
  60.     for (int i = 1; i <= n; i++)
  61.     {
  62.         scanf("%d%d", &d[i], &p[i]);
  63.     }
  64.     Sort(d, p, n);
  65.     int *J = (int *)malloc(sizeof(int)*n);
  66.     int sum=JS(d, J, n,p);
  67.     printf("\n%d", sum);
  68.     return 0;
  69. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值