试题 算法提高 进攻策略加强
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物。
首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻。使用第i种僵尸需要花费Wi资源,可以得到Pi的攻击效果。在这里,我们认为多个僵尸总的攻击效果就是他们每个攻击效果的代数和。
地图共有n行,对于第i行,最左端有若干植物,这些植物需要至少Qi的攻击才能被全部消灭。若一行上的植物全部被消灭,我们称这一行被攻破。
由于资源紧张,你只有总量为K的资源,不一定能够攻破所有行。但统治者希望攻破相邻的T行,并希望T尽量的大。你能帮他算出T的值吗?
输入格式
第一行三个非负整数:m、n、K;
第二行m个正整数,第i个数表示Wi;
第三行m个正整数,第i个数表示Pi;
第四行n个非负整数,第i个数表示Qi。
输出格式
3 11 39
5 2 11
3 1 7
5 3 6 10 3 2 4 200 1 1 1
样例输入
一个满足题目要求的输入范例。
例:
2 2
1 2
3 4
样例输出
4
数据规模和约定
对于70%的数据:n<=1000
对于100%的数据:n<=200000,m<=100,K<=1000000,所有Pi、Qi<=100000000
解题思路:暴力算法,首先将数组Q(植物需要的Q)升序排列,然后遍历每一行植物的Q,再遍历所有的僵尸,找到最小花费并从k中减去最小花费,攻破的行数++;直到 k < 当前行植物的Q的最小花费时,跳出for循环,遍历终止。
AC代码如下:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct Muddy{
long long W,P;
Muddy(long long ww,long long pp):W(ww),P(pp){ }
Muddy(){ }
bool operator <(const Muddy &M) const{
return 1.0*W/P>1.0*M.W/M.P;
}
};
long long m,n,k;
Muddy MD[101];
long long Q[200001];
long long curK;
long long lines=0;
int flag=0;
void getMinCost(long long pos){
long long cost=1e9;
if(Q[pos]==0){
lines++;
return;
}
for(int i=1;i<=m;i++){
long long thisC=ceil(Q[pos]/MD[i].P);
cost=min(cost,thisC*MD[i].W);
}
if(curK<cost){
flag++;
return;
}
curK-=cost;
lines++;
}
int main(int argc, char** argv) {
cin>>m>>n>>k;
for(int i=1;i<=m;i++)
cin>>MD[i].W;
for(int i=1;i<=m;i++)
cin>>MD[i].P;
for(int i=1;i<=n;i++)
cin>>Q[i];
curK=k;
sort(Q+1,Q+n+1);
sort(MD+1,MD+m+1);
for(int i=1;i<=n;i++){
if(flag>0)
break;
getMinCost(i);
}
cout<<lines<<endl;
return 0;
}