hdu4221Greedy? 贪心

//n个任务 , 每个任务有截止时间di和工作时间ci
//问怎样安排时间使得前i个任务总的工作时间ti - di的最大值最小
//直接安排di越大越后
//A列为按di越大越后排列
//现在选两个点i , j (i < j)将他们的位置交换 , 形成序列B
//那么对于这两个序列在i之前和在j之后的所有点A , B求出的值一样
//对于A的中间的值都小于B的j位置的值
#include
#include
#include
#include
using namespace std ;
const int maxn = 100010 ;
struct node
{
    int c , d;
}work[maxn] ;
bool cmp(struct node a, struct node b)
{
    return a.d < b.d ;
}
int main()
{
    int T , N ;
    int cas = 0;
    scanf("%d" ,&T) ;
    while(T--)
    {
        scanf("%d" ,&N) ;
        for(int i = 1;i <= N;i++)
        scanf("%d%d",&work[i].c ,&work[i].d);
        sort(work+1,work+1+N , cmp) ;
        __int64 ans = 0;
        __int64 sum = 0 ;
        for(int i = 1;i <= N ;i++)
        {
            sum+= work[i].c ;
            ans = max(ans , (sum-work[i].d)>0?(sum-work[i].d):0);
        }
        printf("Case %d: " ,++cas) ;
        printf("%I64d\n" ,ans);
    }
}

你可能感兴趣的:(贪心)