美文网首页
算法设计与分析 4.2 洪尼玛与网络攻防战

算法设计与分析 4.2 洪尼玛与网络攻防战

作者: 阿明DunDunDun | 来源:发表于2019-11-10 00:11 被阅读0次

题目描述:

洪尼玛有一家金融公司。有一天,有n名黑客袭击了他公司的账户,第i名黑客每分钟可以从账户中盗取c_i元,对付第i名黑客洪尼玛需要t_i分钟进行防守、t_i分钟进行攻击(该过程不会也不许被中断)。一旦洪尼玛对第i名黑客开始进行攻防,该黑客将无法继续盗取钱财,但其他未被攻防的黑客可以继续盗取钱财。这n名黑客从第0时刻开始进行袭击。洪尼玛想知道对付完这n名黑客后被盗取的金额最小是多少?

输入格式:

第一行为一个正整数n,表示黑客的数量;

接下来n行,每行两个正整数c_it_i,表示第i名黑客每分钟可以盗取的金额和洪尼玛对他进行攻防所需的时间;

对于60%的数据,1<=n<=10^3

对于100%的数据,1<=n<=10^51<=c_i、t_i<=10^3

输出格式:

输出一个正整数,表示被盗取的最小金额。

样例输入:

5
1 1
2 2
3 3
4 4
5 5

样例输出:

170

解法:

一看这题目,典型的贪心算法啊,出处应该是某个牛吃草问题,要把牛一只一只送回去,路上花费来回两次的时间,看最终损失了多少草。

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
#define Maxn 100000
using namespace std;
int n;
struct node
{
    int t;//攻防所需的时间
    int c;//每次偷的钱
};
node a[Maxn];
bool cmp(node x, node y)
{
    //    算一下哪个最能偷。。。
    double t1 = (x.c * 1.0) / (x.t * 1.0);
    double t2 = (y.c * 1.0) / (y.t * 1.0);
    return t1 > t2;
}
int main()
{
    scanf("%d", &n);
    ll sum = 0;
    ll ans = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d", &a[i].c, &a[i].t);
        sum += a[i].c;
    }
    sort(a, a + n, cmp);

    for (int i = 0; i < n - 1; i++)
    {
        sum -= a[i].c;
        ans += sum * a[i].t * 2;
    }
    cout << ans << endl;
    return 0;
}

话不多说,代码骑脸上了还能不过?

注意一个问题,最好不要用int型去定义sum和ans,不用long或者long long的话,数据累计起来会当场去世。


相关文章

网友评论

      本文标题:算法设计与分析 4.2 洪尼玛与网络攻防战

      本文链接:https://www.haomeiwen.com/subject/xglnbctx.html