HDU3090 Go Home

文章探讨了回家途中如何利用有限的金币雇佣保镖以最小化被抢劫的风险。通过分析每段路程的强盗数量和长度,提出了一种排序并贪心选择的策略来确定最优的保镖雇佣方案。

Go Home
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

There comes the holiday, Partychen set foot on the way home. He takes some ECNU coins to hire bodyguards to prevent from being robbed before he went home. But the bodyguard takes one coin for every kilometer. If Partychen walks without bodyguard , he will be robbed one ECNU coin by every robber on every kilometer . Of course , he can choose where to hire bodyguard or where to be robbed as he like. 
For example , there are two roads on his way home and he wants to use 8 ECNU coins to hire bodyguard , the first road takes 4 kilometers with 5 robbers ( per kilometer ) and the second takes 5 kilometers with 6 robbers. He could choose the last 3 kilometers on the first road and the whole kilometers on the second road to hire bodyguard to protect him, and leave the first kilometer on the first road to be robbed by 5 robbers, which he will be robbed 5 ECNU coins. 
Now , Partychen want to know how many ECNU coins will be robbed at least. 
 

Input

It consists of multi-case . 
Every case starts with two integers N and M ( 0�N�10,000, 0�M�1,000,000,000 ) which means that there are N roads and M ECNU coins to hire bodyguard. 
The followed N lines contains two integers D and P (1<=D<=10,000 , 0<=P<=10 ) , which means the length of every road and the number of robbers in every kilometer on this road. 
End with N=0 and M=0 . 
 

Output

An integer means the number of ECNU coins to be robbed at least.
 

Sample Input

2 8 4 5 5 6 3 1 5 10 5 10 5 10 0 0
 

Sample Output

5 140
 

题意
回家共有 n (0 <= n <=10,000)段路,有 m (0 <= m <= 1,000,000,000)块钱可以雇佣保镖。每段路有ai(0 <= i < n)千米,每千米有bi(0 <= i < n)个强盗。雇用一个保镖一千米需要花费一块钱,可以保证这一千米内不被强盗抢劫。每千米每个强盗抢一块钱。最少被抢劫的钱数是多少。

分析
以每千米的强盗数降序排序,贪心

AC代码如下

#include <cstdio>
#include <algorithm>
using namespace std;
struct Node
{
    int d,p;
};
Node roads[10001];
int n,m;
int sum;
bool cmp(Node n1,Node n2)
{
    return n1.p > n2.p;
}
int main()
{
    while(scanf("%d %d", &n, &m), m!=0 || n!=0)
    {
        sum = 0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d", &roads[i].d, &roads[i].p);
            sum += roads[i].d*roads[i].p;
        }
        sort(roads, roads+n, cmp);<span style="white-space:pre">		</span>//以强盗数降序sort
        for(int i=0; i<n; i++)<span style="white-space:pre">			</span>//贪心
        {
            if(m > roads[i].d)
            {
                m -= roads[i].d;
                sum -= roads[i].d * roads[i].p;
            }
            else
            {
                sum -= m * roads[i].p;
                break;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值