zoukankan      html  css  js  c++  java
  • 51nod 消灭兔子


     
    李陶冶 (命题人)
    基准时间限制:1 秒 空间限制:131072 KB 分值: 40
    有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 <= i <= M)。假设每种箭只能使用一次,每只免子也只能被射一次,计算要消灭地图上的所有兔子最少需要多少Q币。如不能杀死所有兔子,请输出No Solution。
    特别说明:1、当箭的伤害值大于等于兔子的血量时,能将兔子杀死;2、血量B[i],箭的伤害值D[i],箭的价格P[i],均小于等于100000。
    Input
    第1行:两个整数N,M,中间用空格分隔(1 <= N, M <= 50000),分别表示兔子的个数和箭的种类。
    第2 - N + 1行:每行1个正整数(共N行),表示兔子的血量B[i](1 <= B[i] <= 100000)。
    第N + 2 - N + M + 1行:每行2个正整数(共M行),中间用空格分隔,表示箭所能造成的伤害值D[i],和需要花费的Q币P[i](1 <= D[i], P[i] <= 100000)。
    Output
    输出最少需要多少Q币才能消灭所有的兔子。如果不能杀死所有兔子,请输出"No Solution"。
    Input示例
    3 3
    1
    2
    3
    2 1
    3 2
    4 3
    Output示例
    6
    C++的运行时限为:1000 ms ,空间限制为:131072 KB 示例及语言说明请按这里

    发现我贪心的题都不是很会搞

    果然是我太蠢啊再见

    刚开始想的时候有想过贪心

    但是没认真想

    想用费用流(限制一下流量为1)

    发现数据太大跑不过

    再讲一下贪心

    将兔子从大到小排序

    箭按伤害也从大到小排序

    然后开始一个一个兔子选

    把能杀死他的箭都丢进优先级为费用的小根堆里(优先队列)

    然后就选堆顶啦

    证明一下喽

    要保证全部兔子都被杀死嘛

    所以如果从小的兔子开始杀的话,大的就不一定杀得死了

    然后对于每一只兔子都是费用最小的嘛

    而且能杀死大的,就肯定能杀死小的

    所以就从大到小一只一只选就好啦

    据说还有一种贪心策略

    也是要箭从小到大排序

    刚开始不用考虑费用

    先把全部兔子都杀死

    然后如果还有剩箭的话就拿费用小的去替换掉费用大的(由于从小到大排序,所以一定杀得死)

    也不错啊

    上代码:

    #include<cstdio>
    #include<queue>
    #include<algorithm>
    const int N=50005;
    int b[N];
    struct node
    {
    	int damage,value;
    }e[N];
    struct edgt
    {
    	int damage,value;
    	bool operator < (const edgt &x)
    	const 
    	{
    		return value>x.value;
    	}
    };
    bool cmp1(node a,node b)
    {
    	return a.damage>b.damage;
    }
    bool cmp2(int a,int b)
    {
    	return a>b;
    }
    std::priority_queue<edgt>q;
    int main()
    {
    	int n,m;
    	scanf("%d %d",&n,&m);
    	for(int i=1;i<=n;i++)	scanf("%d",&b[i]);
    	for(int i=1;i<=m;i++)	scanf("%d %d",&e[i].damage,&e[i].value);
    	std::sort(b+1,b+1+n,cmp2);std::sort(e+1,e+1+m,cmp1);
    	int cnt=1;int sum=0;
    	for(int i=1;i<=n;i++)
    	{
    		while(b[i]<=e[cnt].damage&&cnt<=m)	q.push((edgt){e[cnt].damage,e[cnt].value}),cnt++;
    		if(!q.empty())
    		{
    			edgt x=q.top();q.pop();
    			sum+=x.value;
    		}
    		else 
    		{
    			printf("No Solution
    ");return 0;
    		}
    	}
    	printf("%d
    ",sum);
    	return 0;
    }




  • 相关阅读:
    Cocos2dx引擎10-事件派发
    IE无法打开internet网站已终止操作的解决的方法
    让程序在崩溃时体面的退出之Dump文件
    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
    RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
    cocos 3.0 一键打包android平台应该注意的细节
    Matlab画图-非常具体,非常全面
    linux和windows文件名称长度限制
    Javascript的DOM操作
    50个高端大气上档次的管理后台界面模板
  • 原文地址:https://www.cnblogs.com/Brian551/p/7353029.html
Copyright © 2011-2022 走看看