链接:https://vjudge.net/problem/HDU-1789#author=Andy_acmer
题意:
交大校队刚从2018焦作站ACM/ICPC回来。现在他有很多作业要做。每个老师给他一个交作业的最后期限。
如果他们在最后期限后交作业,老师就会降低他的期末成绩。
现在我们假设每个人做作业都需要一天。
所以他们想到了要安排做作业的顺序,把降低的分数降到最低。
请帮助他们。
思路:
贪心。
优先选择减分较多的科目,从截至日期往前找,找到第一个没有用过的天。
如果找不到则讲其分数累加。
代码:
#include <iostream> #include <memory.h> #include <string> #include <istream> #include <sstream> #include <vector> #include <stack> #include <algorithm> #include <map> #include <queue> #include <math.h> #include <cstdio> using namespace std; typedef long long LL; const int MAXN = 1000 + 10; struct Node { int _t; int _v; bool operator < (const Node & that) const { /* if (this->_t != that._t) return this->_t < that._t; */ return this->_v > that._v; } }node[MAXN]; int vis[MAXN]; int main() { int t, n; cin >> t; while (t--) { memset(vis, 0, sizeof(vis)); cin >> n; for (int i = 1;i <= n;i++) cin >> node[i]._t; for (int i = 1;i <= n;i++) cin >> node[i]._v; sort(node + 1, node + 1 + n); int res = 0; for (int i = 1;i <= n;i++) { int w = node[i]._t; while (vis[w] == 1 && w > 0) w--; if (w == 0) res += node[i]._v; else vis[w] = 1; } cout << res << endl; } return 0; }