2020 年百度之星·程序设计大赛 - 初赛二(Poker)

Problem Description
小沃沃在玩一个有趣的游戏。
初始他有 n 块钱,每一轮他需要投入至少 m 块钱,系统会拿走其中 p% 的钱,并把剩下的钱还给他。
请问在最优情况下,小沃沃最多可以玩多少轮?
假设当前一轮小沃沃投入了 x 块钱,那么他可以收回 ⌊x×(1−p%)⌋ 块钱,其中 ⌊a⌋ 表示 a 取下整。
小沃沃每一轮投入的钱不能超过他现在拥有的钱。
每一轮投入的钱必须为整数。
Input
第一行一个正整数 test(1≤test≤100000) 表示数据组数。
对于每组数据,一行三个整数 n,m,p(1≤n≤100000,1≤m≤1000,1≤p≤100)。
 
Output
对每组数据输出一行一个整数表示答案。

Sample Input
2
10 2 50
10 2 100
 
Sample Output
9
5
 

一开始错误的程序

#include<cstdio> 
#include<cmath>
using namespace std;

int main()
{
	int t,n,m,p;
	scanf("%d",&t);
	while (t--)
	{
		int ans=0;
		scanf("%d%d%d",&n,&m,&p);
		int k=ceil((100-p)*0.01*m);
		if (k==0) printf("%d\n",n/m);
		else 
		{
			while (n>=m)
			{
				ans++;
				n-=k;
			}
			printf("%d\n",ans);
		}
	}	
	return 0;
}

错误原因:

int k=ceil((100-p)*0.01*m); //这是回收的钱……(傻了的我)
while (n>=m) //耗时长,需要改进
{
	ans++;
	n-=k;
}

AC代码:

#include<cstdio> 
#include<cmath>
using namespace std;

int main()
{
	int t,n,m,p;
	scanf("%d",&t);
	while (t--)
	{
		int ans=0;
		scanf("%d%d%d",&n,&m,&p);
		int k=ceil(m*p*0.01); //每次拿走钱 
		while (n>=m)
		{
			int cnt=n/m; //当不补时候可以玩几轮 
			ans+=cnt; 
			n-=cnt*k; 
		}
		printf("%d\n",ans);
	}	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题意 有一组牌,每张牌由一个字符串表示,字符串中的第一个字母表示牌的点数(A、K、Q、J、T、9、8、7、6、5、4、3、2),第个字母表示牌的花色(S、H、D、C 表示黑桃、红桃、方块、梅花)。例如:"TH" 表示 10 黑桃。你的任务是输出一组最大的牌。我们可以将所有牌分成三类: - 对子 (Pair) - 两张牌有相同的点数; - 两对 (Two Pairs) - 两组对子,每组对子有相同的点数,且第一组的点数大于第组; - 三个 (Three of a Kind) - 三张牌有相同的点数; - 顺子 (Straight) - 所有五张牌点数连续,`"A"` 可以在顺子的开始或结尾; - 同花 (Flush) - 所有五张牌花色相同; - 三条 (Three of a kind) - 三张牌有相同的点数; - 四条 (Four of a Kind) - 四张牌有相同的点数; - 同花顺 (Straight flush) - 同时是顺子和同花; - 皇家同花顺 (Royal flush) - 同时是顺子、同花,且最大点数为 `"A"`。 如果两组牌的点数一样,那么我们会比较他们的大小。点数从大到小排列为:`A`、`K`、`Q`、`J`、`T`、`9`、`8`、`7`、`6`、`5`、`4`、`3`、`2`。 输入格式 输入文件名为 `"poker.in"`。第一行一个整数,表示五张牌。接下来五行,每行表示一张牌。 输出格式 输出文件名为 `"poker.out"`。输出一行五个字符串表示最大的牌。每个字符串的前两位表示点数,后两位表示花色。 思路 由于每张牌有两个属性,即点数和花色,因此可以把两个属性分开排序。分别按照点数和花色排序后,再根据牌型的判断条件,判断最大的牌型即可输出。 判断牌型的顺序为前后顺序,如果有更上层的牌型,就不用再考虑下层的牌型了。 所以考虑一个独立的函数,输入一个排完序的五张牌,返回最大的牌型,若最大牌型不止一件,则返回最大牌型的最大点数。 判断牌型的顺序是: - 判断皇家同花顺: - 当前牌是否为“`TS`”、“`JS`”、“`QS`”、“`KS`”、“`AS`”; - 判断是否为同花顺。 - 判断同花顺:先转换为顺子判断,再判断是否为同花。 - 判断四条:有四张点数相同的牌。 - 判断三条和两对:先判断有没有 3 张点数相同的牌,再判断有无两对。 - 判断两对: - 找到点数相同的第一对牌; - 找到点数相同的第对牌,它的点数不能与第一对牌的点数相同; - 判断第三张牌,它的点数与其中的一个点数相同,与另一个点数不同。 - 判断三条、两对和对子:依次判断有多少张点数相同的牌。 具体实现见代码。 代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值