implement 贪心
老实说,思路并不是很难。但是,实现起来是很有难度的。
其实就是如果两个元素冲突了,那么我们就增加那个代价比较小的就可以了。
很简单,但是我的实现超时了。懊恼。
个人感觉实现起来真的是有一定的难度。
推荐这个并查集实现的代码:
#include <map> #include <iostream> #include <algorithm> using namespace std; #define sd(n) scanf("%d", &n) #define sdd(n, m) scanf("%d%d", &n, &m) #define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k) #define pd(n) printf("%d\n", n) #define pc(n) printf("%c", n) #define pdd(n, m) printf("%d %d\n", n, m) #define pld(n) printf("%lld\n", n) #define pldd(n, m) printf("%lld %lld\n", n, m) #define sld(n) scanf("%lld", &n) #define sldd(n, m) scanf("%lld%lld", &n, &m) #define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k) #define sf(n) scanf("%lf", &n) #define sc(n) scanf("%c", &n) #define sff(n, m) scanf("%lf%lf", &n, &m) #define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k) #define ss(str) scanf("%s", str) #define rep(i, a, n) for (int i = a; i <= n; i++) #define per(i, n, a) for (int i = n; i >= a; i--) #define mem(a, n) memset(a, n, sizeof(a)) #define debug(x) cout << #x << ": " << x << endl #define pb push_back #define all(x) (x).begin(), (x).end() #define fi first #define se second #define mod(x) ((x) % MOD) #define gcd(a, b) __gcd(a, b) #define lowbit(x) (x & -x) typedef pair<int, int> PII; typedef long long ll; typedef unsigned long long ull; typedef long double ld; const int MOD = 1e9 + 7; const double eps = 1e-9; const int N = 200010; int n, m, k, q; int ans, tmp, cnt; int flag; map<int, int> fa; struct node{ int num; int t; } a[N]; bool cmp(node a, node b){ return a.t == b.t ? a.num < b.num : a.t > b.t; } int find(int x){ return fa[x] == 0 ? x : fa[x] = find(fa[x]); } void mix(int x, int y){ int xx = find(x); int yy = find(y); if (xx != yy) fa[xx] = yy; } int main(){ sd(n); rep(i, 1, n) sd(a[i].num); rep(i, 1, n) sd(a[i].t); sort(a + 1, a + 1 + n, cmp); ll ans = 0; rep(i, 1, n) { int res = find(a[i].num); if (res == a[i].num) { mix(res, res + 1); } else { ans += 1ll * (res - a[i].num) * a[i].t; mix(res, res + 1); } } pld(ans); return 0; }
这里面,他用哈希表代替并查集的数组。因此也改变了find函数。这真的是技巧。
并查集用的非常巧妙。