Poj P1456 Supermarket___贪心+并查集

题目大意:

NWiEndi使

1N,Wi,Endi104

分析:

这题很显然可以用贪心去做,
将利润排序,然后从DayEndiDay1判断能否出售,
显然在能允许出售的天数中要尽可能晚的出售,
所以我们要找一个允许出售的最晚天数并在此天出售
时间复杂度:O(NlogN+i=1NEndi)

显然对于找一个允许出售的最晚天数的过程,
是可以用并查集优化的
当一个物品找到一个允许出售的最晚天数DayX,那么下次如果你选到DayX,显然只能向上选,即选DayX1,而如果DayX1也被选了,也同理操作,
而这个就可以利用并查集的路径压缩,
使得能够快速找出允许出售的最晚天数

代码:

①裸贪心:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 0x7ffffff
#define N 10005

using namespace std;

struct Node {
    int w, r;
}a[N];
int n, f[N];

bool cmp(Node aa, Node bb) {
    return aa.w > bb.w;

}
int main() {
    while (~scanf("%d", &n)) {
           int max_day = 0;
           for (int i = 1; i <= n; i++){
                scanf("%d %d", &a[i].w, &a[i].r);
                max_day = max(max_day, a[i].r);
           }  
           sort(a + 1, a + n + 1, cmp);
           for (int i = 1; i <= max_day; i++) f[i] = 0;
           for (int i = 1; i <= n; i++) 
                for (int j = a[i].r; j >= 1; j--)
                     if (!f[j]) {
                          f[j] = a[i].w;
                          break;
                     }
           int ans = 0;
           for (int i = 1; i <= max_day; i++) ans += f[i];
           printf("%d\n", ans);
    }
    return 0;
}

②贪心+并查集:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 0x7ffffff
#define N 10005

using namespace std;

struct Node {
    int w, r;
}a[N];
int n, f[N], dis[N];

bool cmp(Node aa, Node bb) {
    return aa.w > bb.w; 
}

int Find(int x) {
    if (f[x] == x) return x;
    f[x] = Find(f[x]);
    return f[x];
}

int main() {
    while (~scanf("%d", &n)) {
           int max_day = 0;
           for (int i = 1; i <= n; i++){
                scanf("%d %d", &a[i].w, &a[i].r);
                max_day = max(max_day, a[i].r);
           }  
           sort(a + 1, a + n + 1, cmp);
           for (int i = 1; i <= max_day; i++) dis[i] = 0, f[i] = i;
           for (int i = 1; i <= n; i++) {
                int x = Find(a[i].r);
                if (x > 0) {
                    dis[x] = a[i].w;
                    f[x] = x - 1;
                }
           }
           int ans = 0;
           for (int i = 1; i <= max_day; i++) ans += dis[i];
           printf("%d\n", ans);
    }
    return 0;
}
阅读更多
版权声明:欢迎借鉴,谢绝抄搬。 https://blog.csdn.net/Gx_Man_VIP/article/details/80501642
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭