这个题一看好像就是用贪心做啊,一个结构体,拍一下序,vis数组一遍遍扫荡,最后输出值,没错,贪心的确能做出来,而这类题目也能应用并查集,实现得思想也是贪心
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1e4 + 1e2; int pre[maxn]; int n; struct node { int p,d; }obj[maxn]; void init() { for(int i = 0;i < maxn;i++) { pre[i] = i; } memset(obj,0,sizeof(obj)); } bool cmp(node a,node b) { return a.p > b.p; }
一开始都差不多哈,并查集pre【i】得含义是第i天前第一个空得天数是第几天!!(差不多了吧和你反向暴力一遍vis数组貌似差不多)
但是并查集能路径压缩欸
int Find(int x) { if(x != pre[x]) { int tem = pre[x]; pre[x] = Find(tem); } return pre[x]; }
int main() { int n,a,d; while(~scanf("%d",&n)) { init(); for(int i = 0;i < n;i++) { scanf("%d%d",&obj[i].p,&obj[i].d); } sort(obj,obj+n,cmp); int ans = 0; for(int i = 0;i < n;i++) { int r = Find(obj[i].d); if(r > 0) { ans += obj[i].p; pre[r] = r - 1; } } printf("%d ",ans); } return 0; }
这个题并不算难,主要是提供了另一个思考的方向吧,现在不是出初中高中得应试阶段,每一个类型都有固定得做法,而ACM这种题,就应该去创新的想一想,去应用更多好玩得数据结构,去做更多好玩得事情