社区讨论

求挂分原因

P14635[NOIP2025] 糖果店参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@milfvsnk
此快照首次捕获于
2025/11/30 16:09
3 个月前
此快照最后确认于
2025/12/02 22:01
3 个月前
查看原帖
做法是将 (x+y)/2 和 x 放在一起并排序,做法应该没问题,但似乎炸精度了,把double 改为 long double 就对了,求原因,为什么 m=1e18 的时候精度会炸?
CPP
#include <bits/stdc++.h>
#define int long long
//#define double long double
using namespace std;
int n,cnt,m;
struct node{
	double val;
	int id;
}b[1000005];
bool cmp(node x,node y)
{
	return x.val<y.val;
}
signed main()
{
	freopen("candy3.in","r",stdin);
	freopen("candy.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
	{
		int x,y;
		cin>>x>>y;
		b[++cnt].val=x;
		b[cnt].id=1;
		b[++cnt].val=(x+y)*1.0/2;
	}
	sort(b+1,b+cnt+1,cmp);
	int ans=0;
	for(int i=1;i<=cnt;i++)
	{
		if(b[i].id==0)
		{
			ans+=2*m/(b[i].val*2);
//			int x=2*m/(b[i].val*2);
//			m%=(int)(b[i].val*2);
			m-=(int)(2*m/(b[i].val*2))*b[i].val;
		}	
		else
		{
			if(b[i].val<=m)
			{
				m-=b[i].val;
				ans++;
			}
		}
	}
	cout<<ans<<'\n';
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...