problem A
该题为本人在codeforces上做的第一题,对英文题面还有些不适应,
本人误认为是n次move必能kill,在test2上吃了大亏;
提取题意是:
t组数据,每组包含一个n和一个H,还有n个 integers values(a1~an);
n个 integers values(a1~an)称为伤害值,每次使H减去该值,直到H<=0,计算需要的最小次数。
并且同一个伤害值不能连续用两次,若不涉及O(n^2)算法,int可以满足全部需求;
首先分析
只规定了同一个伤害值不能连续用两次,所以很容易想到最大的伤害值和次大的值交替使用, 是比较典型的贪心算法;
那么就有两种方法,一个是输入数据的时候进行比较大小,记录下最大伤害值或次大伤害值,以时间换空间
另一个是全部存入数组a[n],再在头文件algorithm下,用sort(a,a+n,less<int>n())或sort(a,a+n,less<int>())进行排序后选择
接着本人最初进行H-=ai;判断H<=0时结束循环,记录次数
结果超时了(解法过于暴力)
可以进行优化,如设sum=最大值+次大值;
if(H%sum==0),ans=h/sum*2;
if(H%sum!=0&&H%sum>最大值),ans=[h/sum]*2+2;
if(H%sum!=0&&H%sum<=最大值),ans=[h/sum]*2+2;
就可以过了
然而菜鸡如我根本用不到二分查找
#include<iostream>
#include<algorithm>
using namespace std;
long long t,n,h,i,j,f,k;
int main() {
cin>>t;
while(t--) {
cin>>n>>h;
long long a[n];
for(i=0; i<n; i++) {
cin>>a[i];
}
sort(a,a+n);
k=0;
for(i=0; h>0; i++) {
if(h%(a[n-1]+a[n-2])==0) {
f=h/(a[n-1]+a[n-2]);
k=f*2;
break;
}
if(h%(a[n-1]+a[n-2])!=0&&h%(a[n-1]+a[n-2])<=a[n-1]) {
f=h/(a[n-1]+a[n-2]);
k=f*2+1;
h=0;
break;
}
if(h%(a[n-1]+a[n-2])!=0&&h%(a[n-1]+a[n-2])>a[n-1]) {
f=h/(a[n-1]+a[n-2]);
k=f*2+2;
h=0;
break;
}
}
cout<<k<<endl;
}
return 0;
}