本题练习快速排序和动态规划。
题目连接:
http://acm.hit.edu.cn/hoj/problem/view?id=3136
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define Maxn 5002
int be[Maxn];//开始时刻
int en[Maxn];//结束时刻
int pri[Maxn];//优先级
int best[Maxn];//the maximum total value of beauty level
//快速排序,以en[i]升序排列
void qsort(int l,int r)
{
int x = en[rand()%(r-l+1) + l];//+l
int i = l;
int j = r;
while(i<=j)
{
while(en[i]<x)
{
i++;
}
while(en[j]>x)
{
j--;
}
if(i<=j)
{
swap(be[i],be[j]);
swap(en[i],en[j]);
swap(pri[i],pri[j]);
i++;
j--;
}
}
if(l<j)
{
qsort(l,j);
}
if(i<r)
{
qsort(i,r);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf("%d",&n)!=EOF)
{
int ans = 0;
for(int i=0; i<n; i++)
{
scanf(" %d %d %d",&be[i],&en[i],&pri[i]);
en[i] = en[i] + be[i] - 1;
}
qsort(0,n-1);
for(int i=0; i<n; i++)
{
best[i] = pri[i];
}
for(int i=0; i<n; i++)
{
for(int j=i-1; j>=0; j--)
{
if(be[i]>en[j])
{
best[i] = max(best[i],best[j] + pri[i]);
}
}
}
for(int i=0; i<n; i++)
{
if(best[i]>ans)
{
ans = best[i];
}
}
printf("%d\n",ans);
}
return 0;
}