Luogu P1802 5倍經驗日_KEY

5倍經驗日

題目背景
現在樂鬥有活動了!每打一個人可以獲得5倍經驗!absi2011卻無奈的看着那一些比他等級高的好友,想着能否把他們幹掉。幹掉能拿不少經驗的。
題目描述
現在absi2011拿出了x個迷你裝藥物(嗑藥打人可恥….),準備開始與那些人打了由於迷你裝一個只能管一次,所以absi2011要謹慎的使用這些藥,悲劇的是,沒到達最少打敗該人所用的屬性藥了他打人必輸>.<所以他用2個藥去打別人,別人卻表明3個藥才能打過,那麼相當於你輸了並且這兩個屬性藥浪費了。現在有n個好友,有輸掉拿的經驗、贏了拿的經驗、要嗑幾個藥才能打過。求出最大經驗(注意,最後要乘以5)
輸入輸出格式
輸入格式:
第一行兩個數,n和x後面n行每行三個數,分別表示輸了拿到的經驗(lose[i])、贏了拿到的經驗(win[i])、打過要至少使用的藥數量(use[i])。
輸出格式:
一個整數,最多獲得的經驗
輸入輸出樣例
輸入樣例#1:
6 8
21 52 1
21 70 5
21 48 2
14 38 3
14 36 1
14 36 2
輸出樣例#1:
1060
說明
【Hint】
五倍經驗活動的時候,absi2011總是吃體力藥水而不是這種屬性藥>.<
【數據範圍】
對於10%的數據,保證x=0
對於30%的數據,保證n<=10,x<=20
對於60%的數據,保證n<=100,x<=100, 10<=lose[i], win[i]<=100,use[i]<=5
對於100%的數據,保證n<=1000,x<=1000,0<=lose[i]<=win[i]<=1000000,0<=use[i]<=1000

·揹包

這可以說是一道揹包的變形。

首先需要考慮到的是如何將ta轉換爲一個正常 的揹包。

這些數據有一個讓我們都十分不爽的地方就是有兩個值。

所以我們就設置一個基準值,將失敗的經驗值當做基準值,這樣就只剩一個win-lose的“揹包價值”了。

接下來即進行0-1揹包操作

最後輸出時將減去的lose_sum加上,再乘5就好了。

code

#include <cstdio>
#include <cctype>
#define C c = getchar ( )

using namespace std;

inline int read()
{
    static char c;
    while(!isdigit(C));int x=c-'0';
    while(isdigit(C))x=x*10+c-'0';
    return x;
}

inline int max(int x,int y){return x>y?x:y;}

int n,x,win,lose,sum;
int v[1001],c[1001];
long long f[1001];

int main()
{
    n=read(),x=read();
        for(int i=1;i<=n;i++)
        {
            lose=read(),win=read(),c[i]=read();
            v[i]=win-lose,sum+=lose;
        }
        for(int i=1;i<=n;i++)
            for(int j=x;j>=c[i];j--)
                f[j]=max(f[j-c[i]]+v[i],f[j]);
    printf("%lld",(f[x]+sum)*5);
    return 0;
}

O(N*M)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章