小白月赛44 T3 绝命沙虫 题解

绝命沙虫

https://ac.nowcoder.com/acm/contest/11221/C

众所周知,

double 容易被 卡精度

在这道题中,好巧不巧就有一个 double 型数据——充值返点倍率 MM

此题的要求很简单——

NN 元钱购买点数,再出售点数来获得 利润与经验

于是,就有以下的 暴力程序

#include<bits/stdc++.h>
using namespace std;
int t,n;
double m;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		int ans=0,green,red;
		while(n)
		{
			green=min(10000,int(n*100*(m-1.0)));
			red=100*n;
			n=0;
			ans+=int(green/10);
			ans+=int(red/10);
//			printf("green=%d red=%d ans=%d n1=%d ",green,red,ans,n);
			n+=int(red/200);
//			printf("n2=%d\n",n);
		}
		printf("%d\n",ans);
	}
	return 0;
}

然而,

我们获得了 0分的 成绩

反思一下,

应该是被 卡精度(废话

我们知道,绿点的计算公式为:

min(10000,a×100×(M1))\min(10000,a×100×(M−1))

我们化简一下这个式子,即:

min(10000,100×a×M100×a)\min(10000,100×a×M-100×a)

又因为主人公会将手上的钱全部花光,所以有:

min(10000,100×N×M100×N)\min(10000,100×N×M-100×N)

可是,代入这个式子真的能 AC\green{AC} 这道题吗?

我可以肯定地告诉你:能!

我们让 MM 乘上 100100,并且题目保证,

MM 是一位小数

于是,MM 脱胎换骨,成为了 int 类型!

以下,就是此题的 正解代码

#include<bits/stdc++.h>
using namespace std;
int t,n;
double m;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		int ans=0,green,red;
		while(n)
		{
			green=min(10000,int(m*100*n-100*n));//此为修改处
			red=100*n;
			n=0;
			ans+=int(green/10);
			ans+=int(red/10);
//			printf("green=%d red=%d ans=%d n1=%d ",green,red,ans,n);
			n+=int(red/200);
//			printf("n2=%d\n",n);
		}
		printf("%d\n",ans);
	}
	return 0;
}
全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
10
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务