挑战程序设计竞赛 第2章习题 poj 3262 Protecting the Flowers 比率贪心

地址  http://poj.org/problem?id=3262

题意

牛每秒钟吃Di的花朵,将牛赶回家需要时间Ti(来回时间乘以2)
询问以最优的次序将牛赶回家,损失的花朵数量。

输入 第一行输入一个数字N  下面输入N行数字  每行有两个空格隔开的数字表示一头牛赶回家需要的时间T和每秒吃掉的花朵D

输出一个数字   以最优的次序将牛赶回家,损失的花朵数量

解法 

比率贪心

假设两头牛AB 赶回家的时间为TA 和TB ,每秒钟吃掉的花朵为DA和DB

如果先赶A牛回家  那么损失就是  DB*TA*2

如果先赶B牛回家  那么损失就是  DA*TB*2

我们需要赶损失较大的牛回家才能减少损失

那么将所有的牛 两两比较排序 比较函数为

复制代码
struct ELE {
    int t;
    int d;
}ele[N];
int n;

bool cmp(const struct ELE& a, const struct ELE& b) {
    return (a.d * b.t) > (b.d * a.t);
}
复制代码

 

按照该次序赶牛回家 计算损失

复制代码
// 1123555.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;
/*
6
3 1
2 5
2 3
3 2
4 1
1 6
*/
struct ELE {
    int t;
    int d;
}ele[N];
int n;

bool cmp(const struct ELE& a, const struct ELE& b) {
    return (a.d * b.t) > (b.d * a.t);
}

int main()
{
    cin >> n;
    long long destroy = 0;
    long long ans = 0;
    for (int i = 0; i < n; i++) {
        cin >> ele[i].t >> ele[i].d;
        destroy+= ele[i].d;
    }

    sort(ele,ele+n,cmp);

    for (int i = 0; i < n; i++) {
        destroy -= ele[i].d;
        ans += destroy * ele[i].t * 2;
    }

    cout << ans << endl;


    return 0;
}
复制代码

 

posted on   itdef  阅读(64)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示