赚经验

题目描述

小明在玩一款电脑游戏,里面有一关是这样的:
战场上有n个敌人,小明必须把他们全部打败才能通过这关,不过战斗顺序可以小明自己决定。小明如果打败一个比自己经验值高的敌人,那么小明会赚取2点经验值,否则赚取1点经验值。
现在给你小明初始时的经验值和n个敌人的经验值,你能计算出小明最后经验值最高可以到多少吗?

输入格式

输入包含多组测试数据。
每组第一行输入两个正整数N(N<=500)和E(E<=1000),N表示敌人的个数,E表示小明初始时的经验值。
接下来一行输入N个正整数,表示每个敌人的经验值,所有经验值均不超过1000。

输出

对于每组输入,输出小明最后可以到达的最高经验值。

样例输入

5 91
88 90 92 94 98

样例输出

99

 

分析:

很简单的一道贪心题,先把比小明经验值大的敌人按照经验值从小到大排序,然后从这些人中经验值最小的那个敌人开始逐一打败,最后再打败那些一开始经验值就比小明低的敌人,这就是最优解。

源码:

 

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1009];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        for(int i=0;i<m;i++)
        scanf("%d",&a[i]);
        sort(a,a+m);
        int w=0;
        for(int j=0;j<m;j++)
        {
            if(a[j]>n)
            {
                n+=2;
                w++;
            }
        }
        int p;
        p=m-w;
        n+=p;
        printf("%d\n",n);
    }
    return 0;
}


 

posted @ 2013-07-28 20:48  jlins  阅读(286)  评论(0编辑  收藏  举报