【贪心专题】HDU 1257 最少拦截系统&&HDU 2111 Saving HDU (选宝贝)

链接:click here~~

题意:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
【解题思路】:

直接模拟一边就可以,不知道想简单了还是数据太弱,预处理之后,直接判断递减的导弹的数目,判断过的就标记0.

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include<iostream>
using namespace std;
int main()
{
    int a[10000],n;
    while((scanf("%d",&n))!=EOF)
    {
        for (int i=0; i<n; i++) scanf("%d",&a[i]);
        int sum=0;
        for (int i=0; i<n; i++)
            if(a[i]){
                sum++;
                int h=a[i];
                for (int j=i+1; j<n; j++)
                    if (a[j]!=0&&h>=a[j])
                    {
                        h=a[j];
                        a[j]=0;
                    }
            }
        cout<<sum<<endl;
    }
    return 0;
}

HDU 2111
J - Saving HDU

链接:click here~~

题意:
   多种宝贝,种类不少 ,每种宝贝单位体积的价格也不一样 计算出来XHD最多能带回多少价值的宝贝?(假设宝贝可以分割,分割后的价值和对应的体积成正比) 

【解题思路】:贪心选取就可以了。。注意当前已经选取了价值最大的,剩下的不足以继续选,那么就直接乘以接下来的体积,然后记得一定要跳出循环!

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=105;
int n,m,t,i,j,s,num,ans;
struct node
{
    int val,V;
} p[maxn];
bool cmp(node a,node b)
{
    return a.val>b.val;
}
int main()
{
    int tot=1;
    while(~scanf("%d",&n)&&n)
    {
        scanf("%d",&m);
        for(i=0; i<m; i++)
            scanf("%d%d",&p[i].val,&p[i].V);
        sort(p,p+m,cmp);
        int s=0;
        for(i=0; i<m; i++)
        {
            if(n>p[i].V)
            {
                s+=p[i].val*p[i].V;
                n-=p[i].V;
            }
            else
            {
                s+=p[i].val*n;
                break;
            }
        }
        cout<<s<<endl;
    }
    return 0;
}



你可能感兴趣的:(ACM,贪心)