K13283 参观冰淇淋加工厂

题目描述

下午的天气有些炎热,很多同学买了冰淇淋吃,恰好在游乐场里有一个冰淇淋加工厂,科丁校长带着同学们来到了冰淇淋加工厂参观冰淇淋的制作过程。冰淇淋加工厂最近的生意也是非常的火爆,很多订单接踵而至。加工厂的经理是又高兴又担心,高兴的是有大量的订单,收益非常可观,担心的是订单如果完成不了也是要赔付违约金的。

他告诉同学们现在加工厂一共接到了n个订单,由于加工厂产能有限,所以每天只能完成一个订单。每一个订单上都已经写明了交货时间ti,若到时交不了货就要赔付对应的违约金mi,现在经理想要知道该如何安排这些订单才能使得加工厂需要赔付的违约金金额最少,你能帮助加工厂的经理解决这个问题吗?最少需要赔付多少钱呢?

输入格式

第1行:一个整数n表示订单的数量,n≤200

接下来n行:每行两个整数ti和mi,表示订单交货的最后期限以及过期未交货的违约金(单位:万元)。其中1≤t,m≤1000。

输出格式

第1行:一个整数,表示,赔付违约金的总和的最小值。

输入输出样例

输入样例1:

4
1 50
1 100
2 60
3 80

输出样例1:

50

说明

样例说明:

第1天处理违约金为100万元的订单,第二天处理违约金为60万元的订单,第3天处理违约金为80万元的订单,违约金为50万元的订单没有按时交货,需要赔付的违约金的总和是50万元。

【耗时限制】1000ms 【内存限制】128MB

//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct work
{
    int wi;
    int di;
}a[518];
bool cmp(const work &x,const work &y)
{
    return x.wi>y.wi;
}
bool flag[1010];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].di>>a[i].wi;
    }
    sort(a+1,a+n+1,cmp);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        bool ok=false;
        for(int j=a[i].di;j>=1;j--)
        {
            if(flag[j]==false)
            {
                flag[j]=true;
                ok=true;
                break;
            }
        }
        if(!ok) ans+=a[i].wi;
    }
    cout<<ans;
    return 0;
}