网站单页别人是怎么做的/网店推广有哪些方法
题意:给你每种商品的价值和他的可存储天数,如果商品在存储天数之前没有卖掉就作废问最大利润。
思路
可以贪心做,但这是并查集= =。用个结构体存一下价值,天数,给价值降序排序。然后一天数最大的建立并查集。先找价值最大的内个把他当天卖出为K,那么以后碰到同天数但是价值小的就要在最迟在K-1天卖出。
代码
/*/ \7 ∠_/
/ │ / /
│ Z _, < / / `ヽ
│ ヽ / 〉
Y ` / / /
イ● 、 ● ⊂⊃ 〈 /
() へ | \〈> ー 、_ ィ │ /// へ / ノ<| \\ヽ_ノ (_/ │ //7 | / \ / />―r ̄ ̄`ー―_ _/
*/#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3005;
const int inf = 0x3f3f3f3f;
int mp[550][550];
int dir[4][2] = { {1,0},{-1,0},{0,-1},{0,1} };
int n, m;
int vis[550];
int par[10050];int v1;
struct node
{int val, day;
}p[10050];
bool cmp(node x, node y)
{return x.val > y.val;
}
void init(int x)
{for (int i = 0; i <= x; i++){par[i] = i;}
}
int find(int x)
{if (par[x] == x)return x;elsereturn par[x] = find(par[x]);
}
int main()
{while (~scanf("%d", &n)){memset(par, 0, sizeof(par));int mx = 0;for (int i = 0; i < n; i++){scanf("%d%d", &p[i].val, &p[i].day);if (p[i].day > mx)mx = p[i].day;}init(mx);sort(p, p + n, cmp);int sum = 0;for (int i = 0; i < n; i++){int k = find(p[i].day);//printf("%d\n", k);if (k > 0){sum += p[i].val;par[k] =k- 1;}}printf("%d\n", sum);}return 0;
}