【普及二】【飞刀传承】50WA求助

#include<bits/stdc++.h>
#define N 100005
#define M 100005
#define int long long
using namespace std;
struct knife
{
	int kan;
	int fei;
}a[N];
int n,h,ans;
bool cmp(knife s1,knife s2)
{
	return s1.kan<s2.kan;
}
signed main()
{
	cin>>n>>h;
	for(int i=1;i<=n;i++)
  {
  	cin>>a[i].kan>>a[i].fei;
	}
	for(int i=1;i<n;i++)
	{
		h-=a[i].fei;
		ans++;
	}
	while((h-a[n].fei)>0)
	{
		h-=a[n].kan;
		ans++;
	}
	ans++;
	cout<<ans;
	return 0;
}

蒟蒻求条qaq

2 个赞

你这没排吧 :sweat:

2 个赞

先把大的飞出去再拿大的砍

2 个赞

排飞的,砍的看最大值就行了
(sort:?

2 个赞

谢谢~ :hugs:但咋还是50分呢 :thinking:

2 个赞

思路不太对
应该把飞刀伤害和砍刀伤害一起排序(要区分伤害类型),所以一个武器占用数组两个空间。
可以这么存

for(int i=0;i<n;i++){
     cin>>x>>y;
     f[2*i].atk=x;
     f[2*i].type=0;
     f[2*i+1].atk=y;
     f[2*i+1].type=1;
}
2 个赞
#include<bits/stdc++.h>
#define N 100005
#define M 100005
#define int long long
using namespace std;
struct knife
{
	int sh;
	int type;
}a[N];
int n,h,ans,x,y,ks;
bool cmp(knife s1,knife s2)
{
	return s1.sh>s2.sh;
}
signed main()
{
	cin>>n>>h;
	for(int i=1;i<=n;i++)
  {
  	cin>>x>>y;
  	a[i*2].sh=x;
  	a[i*2].type=0;
  	a[i*2-1].sh=y;
  	a[i*2-1].type=1;
  	ks++;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=2*n;i++)
	{
		if(a[i].type==1&&(ks>1||(h-a[i].sh)<=0))
		{
			h-=a[i].sh;
			ks--;
			ans++;
			if(h<0)break;
		}
		else
		{
			int ti=i;
			if(a[i].type==0)ti=i+1;
			while(h-a[ti].sh>0)
			{
				h-=a[i].sh;
				ans++;
			}
			ans++;
			break;
		}
	}
	cout<<ans;
	return 0;
}
}

变成10分了

2 个赞

阿这

1 个赞

这个问题

1 个赞