小白月赛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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
2024-12-27 23:45
已编辑
三江学院 Java
程序员牛肉:死局。学历+无实习+项目比较简单一点。基本就代表失业了。 尤其是项目,功能点实在是太假了。而且提问点也很少。第一个项目中的使用jwt和threadlocal也可以作为亮点写出来嘛?第二个项目中的“后端使用restful风格”,“前端采用vue.JS”,“使用redis”也可以作为亮点嘛? 项目实在是太简单了,基本就是1+1=2的水平。而你目标投递的肯定也是小厂,可小厂哪里有什么培养制度,由于成本的问题,人家更希望你来能直接干活,所以你投小厂也很难投。基本就是死局,也不一定非要走后端这条路。可以再学一学后端之后走测试或者前端。 除此之外,不要相信任何付费改简历的。你这份简历没有改的必要了,先沉淀沉淀
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务