HDU1789

来源:互联网 发布:js 怎么把值输入数据库 编辑:程序博客网 时间:2024/06/13 06:00
题目大意是给定n个任务的截止日期和不完成所扣的分数,每个任务完成需要一天,怎么做问最少扣的分数最小

贪心
首先要安排扣分大的任务,如果先安排分数小的任务,也许就会导致分数大的任务完不成。分数相同的先安排截止日前靠前的。

安排任务尽量从截止日期开始往前安排,如果从前往后安排,可能会使某些可以完成的任务不能完成。

#include <cstdio>#include <cstring>#include <algorithm>#define rep(x, a, b) for(int x = a; x < b; ++x)using namespace std;int n;const int maxn = 1000 + 10;typedef pair<int, int> pii;pii a[maxn];int vis[maxn * maxn];bool cmp(const pii & A, const pii & B){    return A.second > B.second || (A.second == B.second && A.first < B.first);}bool check(int i){    for(int j = a[i].first; j > 0; --j)    if(!vis[j]) {        vis[j] = true;        return true;    }    return false;}int main(){    int T; scanf("%d", &T);    while(T--){            memset(vis, 0, sizeof(vis));            scanf("%d", &n);            rep(i, 0, n){                scanf("%d", &a[i].first);            }            rep(i, 0, n){                scanf("%d", &a[i].second);            }            sort(a, a + n, cmp);            int sum = 0;            rep(i, 0, n){                if(!check(i)) sum += a[i].second;            }            printf("%d\n", sum);    }    return 0;}
                                             
0 0
原创粉丝点击