百度の星1003度の熊と邪悪な大魔王
7443 ワード
度度度熊と悪の大魔王
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description度熊は可爱い姫を救うため、邪悪な大魔王と戦う.邪悪な大魔王の下にはn体のモンスターがおり、それぞれのモンスターにはa[i]の生命値とb[i]の防御力がある.度度熊は全部でm種類の攻撃方式を持ち、i種類目の攻撃方式はk[i]の結晶石を消費し、p[i]点ダメージを与える.もちろん、度度熊がi番目のスキルを使ってj番目のモンスターに打ち込むと、j番目のモンスターの生命値がp[i]-b[j]減少し、もちろんダメージが防御より小さくなると攻撃は奏効しません.モンスターの生命値が0以下になると、モンスターは消滅します.もちろん各スキルは無限回使用できます.度の熊は少なくともどれだけの晶石を携帯して、すべての怪獣Inputの本題を消滅していくつかの組のテストデータを含みます.1行目の2つの整数n,mは、n個のモンスター、m種のスキルを表す.次のn行は、行ごとに2つの整数、a[i],b[i]で、それぞれモンスターの生命値と防御力を表します.さらにm行、1行あたり2つの整数k[i]とp[i]は、それぞれスキルの消費結晶石数とスキルのダメージ値を表す.データ範囲:1<=n<=1000001<=m<=1000 1<=a[i]<=1000<=b[i]<=10 0<=k[i]<=1000000<=p[i]<=1000 Output各テストデータに対して最小の結晶石消費量を出力し、全てのモンスターを負かすことができない場合、出力-1 Sample Input 1 2 3 3 3 5 10 6 8 8 8 Sample Output 6 18
最も重要なアルゴリズム部分はdpです
試合後更新
タイトルの意味によって完全バックパックで解决し、タイトルから与えられたデータの大きさを见て、计算时に生命値が1-1000、防御値が0-10のすべての场合を计算し、それに対応するすべての场合のモンスターを加えて、消费した水晶数を得ることができます.
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description度熊は可爱い姫を救うため、邪悪な大魔王と戦う.邪悪な大魔王の下にはn体のモンスターがおり、それぞれのモンスターにはa[i]の生命値とb[i]の防御力がある.度度熊は全部でm種類の攻撃方式を持ち、i種類目の攻撃方式はk[i]の結晶石を消費し、p[i]点ダメージを与える.もちろん、度度熊がi番目のスキルを使ってj番目のモンスターに打ち込むと、j番目のモンスターの生命値がp[i]-b[j]減少し、もちろんダメージが防御より小さくなると攻撃は奏効しません.モンスターの生命値が0以下になると、モンスターは消滅します.もちろん各スキルは無限回使用できます.度の熊は少なくともどれだけの晶石を携帯して、すべての怪獣Inputの本題を消滅していくつかの組のテストデータを含みます.1行目の2つの整数n,mは、n個のモンスター、m種のスキルを表す.次のn行は、行ごとに2つの整数、a[i],b[i]で、それぞれモンスターの生命値と防御力を表します.さらにm行、1行あたり2つの整数k[i]とp[i]は、それぞれスキルの消費結晶石数とスキルのダメージ値を表す.データ範囲:1<=n<=1000001<=m<=1000 1<=a[i]<=1000<=b[i]<=10 0<=k[i]<=1000000<=p[i]<=1000 Output各テストデータに対して最小の結晶石消費量を出力し、全てのモンスターを負かすことができない場合、出力-1 Sample Input 1 2 3 3 3 5 10 6 8 8 8 Sample Output 6 18
最も重要なアルゴリズム部分はdpです
for(int td=0; td<=maxd; td++) {
for(int i=1; i<=maxHP; i++) {
long long t = 0;
bool flag=true;
for(int j=0; jif(ski[j].att<=0)continue;
if(i-ski[j].att<=0) {
if(t>ski[j].spend||flag) {
t=ski[j].spend;
flag = false;
}
} else if(flag||t>spe[i-ski[j].att][td]+ski[j].spend) {
t=spe[i-ski[j].att][td]+ski[j].spend;
flag = false;
}
}
spe[i][td]=t;
}
for(int i=0; i
試合後更新
タイトルの意味によって完全バックパックで解决し、タイトルから与えられたデータの大きさを见て、计算时に生命値が1-1000、防御値が0-10のすべての场合を计算し、それに対応するすべての场合のモンスターを加えて、消费した水晶数を得ることができます.
#include
#define MAX 1050
using namespace std;
int n,m;
long long int spe[MAX][11];//
long long int num[MAX][11];// num[100][2] 100 2
long long int ans;
struct skill {
int att,spend;
} ski[MAX];
int main() {
while(cin>>n>>m) {
ans=0;
memset(num,0,sizeof(num));
memset(spe,0,sizeof(spe));
int maxa=0,maxd=0,maxHP=0,a,b,k,p;
for(int i=0; icin>>a>>b;
num[a][b]++;
maxHP = max(maxHP,a);
maxd = max(maxd,b);//
}
for(int i=0; icin>>k>>p;
ski[i].spend=k;
ski[i].att=p;
maxa = max(maxa,ski[i].att);//
}
if(maxa<=maxd) {// ,
cout<1<continue;
}
for(int td=0; td<=maxd; td++) {
for(int i=1; i<=maxHP; i++) {// 、
long long t = 0;
bool flag=true;
for(int j=0; j//
if(ski[j].att<=0)continue;
if(i-ski[j].att<=0) {
if(t>ski[j].spend||flag) {
t=ski[j].spend;
flag = false;
}
}else if(flag||t>spe[i-ski[j].att][td]+ski[j].spend) {
t=spe[i-ski[j].att][td]+ski[j].spend;
flag = false;
}
}
spe[i][td]=t;
}
for(int i=0;i// , 1
}
for(int i=0; i<=maxHP; i++) {
for(int j=0; j<=10; j++) {
ans+=(spe[i][j]*num[i][j]);//
}
}
cout<return 0;
}