Codeforces Round #746 (Div. 2)复盘(持续更新)

problem A

链接Problem - A - Codeforces

 该题为本人在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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值