2017百度之星 资格赛 1003 度度熊与邪恶大魔王(dp)

#代码:

#include<bits/stdc++.h>
#define MAXN 1050


using namespace std;
int n,m;
long long int dp[MAXN][11]={0};//把防御值为j的怪物,生命值打掉i需要消耗的最少的水晶数。
long long int num[MAXN][11]={0};//num[i][j]生命值为i,防御为j的怪物个数
int spend[MAXN],hit[MAXN];
long long int ans=0;
int best[MAXN];
struct SKILL
{
    int hit;
    int spend;
}a[MAXN];
/*bool my_cmp(SKILL x,SKILL y) { if(x.spend!=y.spend) return x.spend>y.spend; }*/

int main()
{
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            ans=0;
            memset(num,0,sizeof(num));
            memset(dp,0,sizeof(dp));
            memset(best,0,sizeof(best));

            int max_hit=0,max_def=0,max_hp=0;int lx,ly;
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&lx,&ly);
                num[lx][ly]++;
                if(max_def<ly)max_def=ly;
                if(max_hp<lx)max_hp=lx;
            }
            int l_num=0;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&lx,&ly);
                if(best[ly]!=0&&best[ly]<=lx)continue;
                best[ly]=lx;
                a[l_num].spend=lx;a[l_num].hit=ly;
                if(a[l_num].hit>max_hit)
                {
                    max_hit=a[l_num].hit;
                }
                l_num++;
            }
            m=l_num;
            if(max_hit<=max_def)
            {
                printf("-1\n");
                continue;
            }
            //sort(a,a+m,my_cmp);
            for(int k_def=0;k_def<=10;k_def++)//枚举所有防御力可能
            {
                //int min_cost=1000000,min_cost_num=-1;
                if(k_def!=0)
                    for(int i=0;i<m;i++)
                    {
                        a[i].hit--;
                    }
                /*for(int i=0;i<m;i++)//找到最小花费 { if(a[i].hit<=0)continue; if(a[i].cost<=min_cost) { min_cost=a[i].cost; min_cost_num=i; } }*/
                for(int i=1;i<=max_hp;i++)
                {
                    long long t=-1;
                    for(int j=0;j<m;j++)
                    {
                        if(a[j].hit<=0)continue;
                        if(i-a[j].hit<=0)
                        {
                            if(t==-1||t>a[j].spend)
                            {
                                t=a[j].spend;
                            }
                            continue;
                        }
                        if(t==-1||t>dp[i-a[j].hit][k_def]+a[j].spend)
                        {
                            t=dp[i-a[j].hit][k_def]+a[j].spend;
                        }
                    }
                    dp[i][k_def]=t;
                }
            }
            for(int i=0;i<=max_hp;i++)
            {
                for(int j=0;j<=10;j++)
                {
                    ans+=(dp[i][j]*num[i][j]);
                }
            }
            printf("%I64d\n",ans);
        }

}

全部评论

相关推荐

12-27 22:36
门头沟学院 Java
点赞 评论 收藏
分享
12-18 18:50
已编辑
门头沟学院 golang
牛客33637108...:重点是要事已密成,在没有进入这家公司之前,不要有任何的泄露信息,我之前跟你一样,面了一家光伏设备厂,底薪7500加上出差补贴大概有13,000左右,已经给了口头offer了,甚至要了我的在校成绩的所有信息,还向我要了三方的网签二维码,到后面还是毁约了,我干过最愚蠢的事情就是向同学透露要签三方的事,之后的失败只会让他们幸灾乐祸,这是即将结束的大学生活给我的最后一课,不要相信任何的口头三方,该面的就去面,甚至签了三方也有毁约的可能,就像我现在签了三方还在外面实习呢,春招还是要继续参加的,不能停止面试,不然到后面毁三方的时候,重新捡起的面试很麻烦的,这是我一点点小小的见解。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务