https://blog.csdn.net/qq_29617037/article/details/51371460
这篇文章有详细解释
代码:
- #include <stdio.h>
- #include <stdlib.h>
- void Sort(int d[], int p[], int n)
- {
- int temp1, temp2;
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= n - i; j++)
- {
- if (p[j] < p[j + 1])
- {
- temp1 = p[j];
- p[j] = p[j + 1];
- p[j + 1] = temp1;
- temp2 = d[j];
- d[j] = d[j + 1];
- d[j + 1] = temp2;
- }
- }
- }
- }
- int JS(int *d, int *J, int n,int *p)
- {
- int r, k, i, j;
- int sum = 0;
- J[0] = 0;
- J[1] = 1;//将第一个并到J中
- sum = p[1];
- k = 1;
- for (i = 2; i <= n; i++)
- {
- r = k;
- while (r > 0 && d[J[r]] > d[i] && d[J[r]] != r)
- {
- r--;
- }
- if (d[J[r]] <= d[i] && d[i] > r)//最后完成时间大于r则可以插入
- {
- for (j = k; j > r; j--)
- {
- J[j + 1] = J[j];
- }
- J[r+1] = i;
- sum += p[i];
- k++;
- }
- }
- for (i = 1; i <= k; i++)
- {
- printf("\n%d ", J[i]);
- }
- return sum;
- }
- int main()
- {
- int n;
- scanf("%d", &n);//作业个数
- int *d = (int *)malloc(sizeof(int)*n);//时间数组d
- int *p = (int *)malloc(sizeof(int)*n);//收益数组p
- for (int i = 1; i <= n; i++)
- {
- scanf("%d%d", &d[i], &p[i]);
- }
- Sort(d, p, n);
- int *J = (int *)malloc(sizeof(int)*n);
- int sum=JS(d, J, n,p);
- printf("\n%d", sum);
- return 0;
- }