1. 程式人生 > >HDU1789 Doing Homework again 做作業【貪心】

HDU1789 Doing Homework again 做作業【貪心】

ffffff bsp AD back scan sum tps 商品 spa

題目鏈接:https://vjudge.net/problem/HDU-1789

題目大意:

給出N個作業的截至日期,和N個作業不交所扣掉的分數,要求輸出扣除分數做少的方案。

解析:

與上一道銷售商品類似,將分數從大到小排序,找到deadline,如果它的期限沒有被占用,就在該天寫完,然後vis置1,如果占用,則從它的前一天開始向前查找有沒有空閑的日期,如果有則占用,vis置1。這樣就可以得到最大分數。然後用總分數減去得到最大分數即為扣除的最小分數。

#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 1000+10 int vis[MAXN]; struct node { int day, sco; }; bool mycmp(node a, node b) { return a.sco > b.sco; } int main() { int t, n; while (scanf("%d", &t) != EOF) { int i, j; while (t--) { memset(vis, 0, sizeof(vis)); node a[MAXN]; scanf(
"%d", &n); int maxday = 0; int sum = 0; for (i = 0; i < n; i++)scanf("%d", &a[i].day); for (i = 0; i < n; i++) { scanf("%d", &a[i].sco); sum += a[i].sco; } int sumscore = 0; sort(a, a
+ n,mycmp); for (i = 0; i < n; i++) { if (!vis[a[i].day]) { vis[a[i].day] = 1; sumscore += a[i].sco; } else { for (j = a[i].day-1; j >= 1; j--) //若該天已被占據,則向之前尋找沒有占據的日期 { if (!vis[j]) { vis[j] = 1; sumscore += a[i].sco; break; } } } } printf("%d\n", sum - sumscore); } } return 0; }

2018-04-21

HDU1789 Doing Homework again 做作業【貪心】