小D和他的魔法石
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
小DD是一个喜欢研究算法的大魔法师。有一天,他在魔法森林里找到了n棵魔法树,其中第i棵魔法树可以生产无限块抗力为aiai,魔力为bibi的魔法石。同时,由于小DD法力强大,他有k次机会,每次可以交换其中两棵魔法树能够产生的魔法石的魔力。
小DD可以吸收魔法石的能量。每吸收一块魔法石的能量,他的抗力就会减少对应魔法石的抗力,魔力就会增加对应魔法石的魔力。他的初始抗力为m,魔力为00。一旦他的抗力小于00,他就没法施展魔法了。现在,小DD想知道,自己在抗力不小于00的前提下,最大的魔力是多少。
注意,小DD必须先使用完所有的交换机会,再吸收魔法石的能量。
输入描述:
输入共33行。 第一行包含22个正整数n,m(1≤n,m≤103)n,m(1≤n,m≤103)和11个非负整数k(0≤k≤100)k(0≤k≤100)。 第二行包含n个正整数,第i个数表示ai(1≤ai≤103)ai(1≤ai≤103)。 第三行包含n个正整数,第i个数表示bi(1≤bi≤109)bi(1≤bi≤109)。
输出描述:
输出共一行,包含一个非负整数,表示最大的魔力。
示例1
输入
2 5 0 1 2 1 3
输出
7
说明
由于k=0,所以没有交换机会。 吸收魔法树11的11块魔法石,吸收魔法树22的22块魔法石。 此时小DD的抗力=5−1−2×2=0=5−1−2×2=0,魔力=1+2×3=7=1+2×3=7。
示例2
输入
2 5 1 1 2 1 3
输出
15
说明
使用唯一的交换机会,交换魔法树11,魔法树22能够产生的魔法石的魔力。 吸收魔法树11的55块魔法石,吸收魔法树22的00块魔法石。 此时小DD的抗力=5−1×5=0=5−1×5=0,魔力=3×5=15=3×5=15。
当k=0时候 我们只需要完全背包就行
然后 n==2时 如果k为奇数先交换b值然后完全背包
其余 直接贪心选取 价值最大 花销最小的就行
int n,m,k;
const int MAX=1e3+10;
int a[MAX];
int b[MAX];
ll f[MAX];
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
if(k==0){
for(int i=1;i<=n;i++){
for(int j=a[i];j<=m;j++){
f[j]=max(f[j],f[j-a[i]]+b[i]);
}
}
cout<<f[m]<<endl;
}
else if(n==2){
if(k&1){
swap(b[1],b[2]);
for(int i=1;i<=n;i++){
for(int j=a[i];j<=m;j++){
f[j]=max(f[j],f[j-a[i]]+b[i]);
}
}
cout<<f[m]<<endl;
}
}
else {
int min1=INF;
int max1=-INF;
for(int i=1;i<=n;i++){
min1=min(min1,a[i]);
max1=max(max1,b[i]);
}
cout<<1ll*max1*(m/min1)<<endl;
}
}

1073



被折叠的 条评论
为什么被折叠?



