题目描述
小天是异世界的魔法师,这天,小天新学了两种魔法,恰好这天有一只血量 xxx 的怪物袭击魔法学院。小天为了守护魔法学院,决定使用新学的魔法挑战怪物。
魔法 111:使用 iii 号魔法 111 后,下一次魔法对怪物造成的伤害 ×ai\times a_i×ai。同时,不能连续使用魔法 111。
魔法 222:使用 iii 号魔法 222 后,对怪物造成 bib_ibi 的伤害。
当怪物的血量小于 111 时,怪物就被击败了。
每一次小天可以使用 nnn 个魔法 111 和 mmm 个魔法 222 中的任意一个。 且每个魔法只能使用一次。
求击败怪物的最小魔法使用次数。
若无法击败,则输出 −1-1−1。
输入描述:
第一行三个整数 n,m,x (0≤n,m≤100,1≤x≤104)n,m,x\ (0\leq n,m\leq 100,1\leq x\leq 10^4)n,m,x (0≤n,m≤100,1≤x≤104)。 第二行 nnn 个整数表示 ai (1≤ai≤100)a_i\ (1\leq a_i\leq 100)ai (1≤ai≤100)。 第三行 mmm 个整数表示 bi (0≤bi≤100)b_i\ (0\leq b_i\leq 100)bi (0≤bi≤100)。
输出描述:
一行一个整数击败怪物的最小魔法使用次数。若无法击败,则输出 −1-1−1。
示例1
输入
3 3 8 1 3 2 2 1 2
输出
3
#include<iostream>
using namespace std;
int main(){
int n,m,x;
int a[110]={0};
int b[110]={0};
int t,i,j,flag;
cin>>n>>m>>x;
for(t=0;t<n;t++) cin>>a[t];
for(t=0;t<m;t++) cin>>b[t];
for(t=0;t<n-1;t++){
flag=t;
for(j=flag+1;j<n;j++){
if(a[flag]<a[j]) flag=j;
}
j=a[t];
a[t]=a[flag];
a[flag]=j;
}
for(t=0;t<m-1;t++){
flag=t;
for(j=flag+1;j<m;j++){
if(b[flag]<b[j]) flag=j;
}
j=b[t];
b[t]=b[flag];
b[flag]=j;
}
//for(t=0;t<n;t++) cout<<a[t];
//for(t=0;t<m;t++) cout<<b[t];
flag=0;
for(i=0;i<m;i++){
if(i<n) flag=flag+a[i]*b[i];
else flag=flag+b[i];
}
if(flag<x){
cout<<-1;
return 0;
}else{
if(b[0]>=x){
cout<<1;
return 0;
}
flag=i=j=0;
while(j<m){
if(flag+b[j]>=x){
flag=flag+b[j];
j++;
}
else if(a[i]*b[j]>=b[j]+b[j+1]){
flag=flag+a[i]*b[j];
i++;
j++;
}else{
flag=flag+b[j]+b[j+1];
j=j+2;
}
if(flag>=x){
cout<<i+j;
return 0;
}
}
}
}
①排序 菜狗选择排序法
②计算理论max伤害是否可以可击败——达成快速-1操作
③以下一定可以击败 分类为:
1)单步操作
确保单步2魔法的奇数次魔法操作
2)双步操作
比较12魔法与22魔法伤害对比
④计算i+j值,使用魔法数值+1,因前面排序因此不用额外再设参数
水哥水哥,划水划水