HDU 4415 Assassin’s Creed

实在难想,贪心。别人的思路:点击打开链接

Problem Description

Ezio Auditore is a great master as an assassin. Now he has prowled in the enemies’ base successfully. He finds that the only weapon he can use is his cuff sword and the sword has durability m. There are n enemies he wants to kill and killing each enemy needs
Ai durability. Every time Ezio kills an enemy he can use the enemy’s sword to kill any other Bi enemies without wasting his cuff sword’s durability. Then the enemy’s sword will break. As a master, Ezio always want to do things perfectly. He decides to kill
as many enemies as he can using the minimum durability cost.

Input

The first line contains an integer T, the number of test cases.

For each test case:

The first line contains two integers, above mentioned n and m (1<=n<=10^5, 1<=m<=10^9).

Next n lines, each line contains two integers Ai, Bi. (0<=Ai<=10^9, 0<=Bi<=10).

Output

For each case, output "Case X: " (X is the case number starting from 1) followed by the number of the enemies Ezio can kill and the minimum durability cost.

Sample Input

2
3 5
4 1
5 1
7 7
2 1
2 2
4 0

Sample Output

Case 1: 3 4
Case 2: 0 0

Source

2012 ACM/ICPC Asia Regional Hangzhou Online

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
struct node{
    int w,s;
}e[maxn];
int visit[maxn];
int t,n,s;
int ans1,ans2,rs1,rs2;
int cmp(node l1,node l2)
{
    return l1.w<l2.w;
}
void solve_1()
{
    int i;
    rs1=s;
    ans1=0;
    for(int i=0;i<n;i++)
    {
        if(e[i].s)  continue;
        if(rs1>=e[i].w)
        {
            ans1++;
            rs1-=e[i].w;
        }
        else   break;
    }
}
void solve_2()
{
    int i;
    rs2=s;
    ans2=0;
    memset(visit,0,sizeof(visit));
    for(i=0;i<n;i++)
    {
        if(e[i].s)  break;
    }
//    cout<<"eeee  "<<i<<endl;
    if(i>=n)   return ;
    if(e[i].w>rs2)  return ;
    int sum=0;
    for(int i=0;i<n;i++)
       sum+=e[i].s;
//    cout<<"222  "<<endl;
    if(sum+1>=n) {ans2=n;rs2-=e[i].w;return ;}
//    cout<<"11111  "<<endl;
    visit[i]=1;
    ans2=sum+1;
    rs2-=e[i].w;
    for(i=n-1;i>=0;i--)
    {
        if(!sum)   break;
        if(!visit[i])
        {
            visit[i]=1;
            sum--;
        }
    }
    for(i=0;i<n;i++)
    {
//        cout<<"fuck  "<<endl;
        if(visit[i]) continue;
        if(rs2<e[i].w)  break;
        ans2++;
        rs2-=e[i].w;
    }
}
int main()
{
    int cas=0;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&s);
        for(int i=0;i<n;i++)
            scanf("%d%d",&e[i].w,&e[i].s);
        sort(e,e+n,cmp);
        solve_1();
        solve_2();
//        cout<<"fuck   "<<ans1<<" "<<rs1<<" "<<ans2<<" "<<rs2<<endl;
        printf("Case %d: ",cas++);
        if(ans1>ans2||(ans1==ans2&&rs1>rs2))
            printf("%d %d\n",ans1,s-rs1);
        else
            printf("%d %d\n",ans2,s-rs2);
    }
    return 0;
}
时间: 2024-09-29 17:48:59

HDU 4415 Assassin’s Creed的相关文章

[贪心] hdu 4415 Assassin’s Creed

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4415 题目意思:  要杀死n个敌人,每个敌人有两个属性a和b,a表示杀他所需要的能力值,b表示杀掉他后可以免费再杀b个敌人.告诉初始能力值,求能杀的最多的敌人,及杀掉那么多敌人的最小花费. 解题思路: 分类+贪心 这道题比较难,也比较经典.好题. 首先把敌人按b值是否为零分成两类A和B.A类表示b值不为零,B类表示b值为零.A.B分别按a从小到大排序 首先明确: 1.如果要杀A类,至少需要A[0]

HDU 4415 Assassin&amp;#39;s Creed(贪心)

pid=4415">HDU 4415 题意: 壮哉我Assassin! E叔有一柄耐久度为m的袖剑,以及n个目标士兵要去解决. 每解决掉一个士兵,消耗袖剑Ai的耐久度.且获得该士兵的武器,能够使用该武器解决Bi名其它士兵. E叔要尽可能地消耗更少耐久度解决很多其它的敌人,求最小消耗与最大杀敌数. 思路: 我们把士兵分为两个集合:e1与e2.e1的士兵 Bi = 0 . e2 的 Bi > 0. 我们发现.假设能解决e2的随意一个,e2就可以全灭,那么我们对e2依据消耗进行升序排序,消

Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 这里可能有环 所以要缩点 可是看例子又发现 一个强连通分量可能要拆分 n最大才15 所以就状态压缩 将全图分成一个个子状态 每一个子状态缩点 求最小路径覆盖 这样就攻克了一个强连通分量拆分的问题 最后状态压缩DP求解最优值 #include <cstdio> #include <cstri

Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖

题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走完全图 可以重复走 有向图 思路:如果是DAG图并且每个点不能重复走 那么就是裸的最小路径覆盖 现在不是DAG 可能有环 并且每个点可能重复走 对于有环 可以缩点 缩点之后的图是DAG图 另外点可以重复走和POJ 2594一样 先预处理连通性 #include <cstdio> #include <cstring> #include <vector> #include &

[游戏分析]刺客信条:兄弟会(Assassin&#39;s&#160;Creed:&#160;Brotherhood)

1 机制 1.1 界面与按键 1.1.1 在主菜单进行功能选择时,画面右下角会伴有按键提示字幕,如{Enter}选择(按Enter键即选择当前指定的功能).{Backspace}返回等. 1.1.2 在游戏进行过程中,画面右上方始终会显示一套按键组合,该组合包含4个{按键}+提示文字的配对.组合内的各个{按键}+提示文字配对会因主角所处场景(行走.攀爬.战斗等)的不同作出对应的变化,以保证玩家在不同场景下都可以迅速了解自己可选择的最基本的操作方法. 1.2 教程 1.2.1 简要介绍前两部的剧情

ACM学习历程—HDU4415 Assassin’s Creed(贪心)

Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemies’ base successfully. He finds that the only weapon he can use is his cuff sword and the sword has durability m. There are n enemies he wants to kill

[GodLove]Wine93 Tarining Round #7

比赛链接: http://vjudge.net/contest/view.action?cid=47643#overview 比赛来源: 2012 ACM/ICPC Asia Regional Hangzhou Online     ID Origin Title   0 / 50 Problem A HDU 4410 Boomerang   50 / 68 Problem B HDU 4411 Arrest   46 / 122 Problem C HDU 4412 Sky Soldiers

CSS规范和最佳实践(转)

When other men are limited by of laws, remember, Everything is permitted. 「 Assassin's Creed: Brotherhood 」 入乡随俗,有一些规则是必须要遵守的,有一些则是经验总结,欢迎拍砖. 这页文档将介绍使用 Alice 开发样式时需要遵守的一些规则,统一可行的规范能保证团队产出优秀的代码. 模块组织规范 Alice 的样式模块组织方式追求扁平化的方式,分为三个层级: 基础框架(reset + icon

季票的优缺点

现如今的电子数码市场,季票得到了越来越广泛的使用,用户用其来获得更多的收益.但是,最近,Ubisoft's取消了该游戏刺客教條 Assassin's Creed Unity的票,这让小编想起了一些需要引起注意的地方: 刺客信条 季票 季票的出现,来自于游戏行业官方扩充包和游戏里的微交易的兴起,主要有两种功能: 首先,季票通常被看作是电子游戏的次要预定.玩家可以提前预付想要的产品.这种活动,相反来说可以让游戏的价格从50到60美金,增长到80-90美金,当然,这也要取决与游戏最初的介个和季票的规模