2021寒假集训Day 6(补)
贪心最难的地方应该就是想出如何找到最优解的算法。这可能需要点灵性和经验吧,直接看例题品。
例一:HDU - 6890
#include<bits/stdc++.h>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 1e6 + 10;
const int inf = 0x3f3f3f3f;
long long n,m,k;
long long a[MAXN];
void solve(){
long long ans=0;
memset(a, 0, sizeof a);
for (int i = 1; i <= m; i++) {
scanf("%lld",&a[i]);
}
sort(a + 1, a + 1 + m);
if (a[1] > k) {
for (int i = 1; i <= m; i++) {
ans += 2*abs(a[i] - k);
}
ans += (k - 1) * 2;
printf("%lld\n", ans);
}
else {
for (int i = 2; i <= m; i++) {
ans += 2 * abs(a[i] - k);
}
ans += (k - 1) * 2;
printf("%lld\n", ans);
}
}
int main() {
int t;
scanf("%d",&t);
while (t--) {
scanf("%lld %lld %lld",&n, &m, &k);
solve();
}
return 0;
}
例2:Length of Bundle Rope(这题用优先队列会方便很多)
#include<bits/stdc++.h>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int n;
priority_queue<int, vector<int>, greater<int> >q;
void solve(){
long long ans=0;
int x;
while (n--) {
scanf("%d", &x);
q.push(x);
}
while (!q.empty()) {
int a, b;
a = q.top();
q.pop();
if (q.empty())break;
b=q.top();
q.pop();
ans += a + b;
q.push(a+b);
}
printf("%d\n", ans);
}
int main() {
int t;
scanf("%d",&t);
while (t--) {
scanf("%d",&n);
solve();
}
return 0;
}
例三:HDU - 3979 (这题本人WA了七次才过……要注意的地方还是挺多的,然后要及时转换贪心策略)
#include<bits/stdc++.h>
#pragma warning(disable:4996)
using namespace std;
const int MAXN = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int n,m,k=1;
struct sqj {
long long hp;
long long atk;
long long num;
}h[10010];
int cmp(const sqj& p, const sqj& q) {
double x, y;
x = p.atk*1.0 / (p.num * 1.0);
y= q.atk *1.0/ (q.num * 1.0);
return x > y;
}
void solve(){
long long sum = 0;
memset(h,0,sizeof h);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", &h[i].hp, &h[i].atk);
if (h[i].hp % m == 0) h[i].num = h[i].hp / m;
else h[i].num = h[i].hp / m+1;
sum += h[i].atk;
}
sort(h + 1, h + n + 1, cmp);
long long ans=0;
for (int i = 1; i <= n; i++) {
ans += sum*h[i].num;
sum -= h[i].atk;
}
printf("Case #%d: %lld\n",k,ans);
}
int main() {
int t;
scanf("%d",&t);
while (t--) {
scanf("%d %d",&n,&m);
solve();
k++;
}
return 0;
}