【CSDN周赛第13期】

陶陶摘苹果:

【题目来源】
NOIP 2005 普及组第一题

依次判断每个苹果能否够到即可
a r r [ i ] < = h + 30 arr[i]<=h+30 arr[i]<=h+30


硬币的面值:

【题目来源】
洛谷P2001

首先如果没有1,一定是no answer。
否则m个1就能凑出1~m所有面值,因此答案不可能超过m。
贪心的想,要凑出大额面值,应该尽量用大额的硬币,因此我们可以对硬币面值排序
假设当前能凑出1~sum的所有面值,而 s u m < a [ i + 1 ] sum<a[i+1] sum<a[i+1],可以贪心地添加一枚 a [ i ] a[i] a[i],这样就能凑出1~sum+a[i]的所有面值了,按照这个规律不断用当前能选的最大面值的硬币更新答案即可。


公司新表:

公司里为了凸显公司的特性。 安装了一个n进制表。 已知新的表的时间是”H:M”。 时间合法的定义为H<=23 && M<=59。 时间有多少种进制定义的方式,依次打印出来。 如果有无数种解输出”-1”,不存在输出”0”。

考虑枚举所有的进制
首先,表上的数字,在该进制下应该是合法的,如0A:23一定不可能是10进制的,也就是说,某位上的数字不能大于进制数(n进制只有0~n-1个数)。
然后考虑最大可能是多少进制的呢?如果是01:01这样的时间,显然有无数种解,因为最末位的数与进制数是无关的( x 0 × b a s 0 x_0\times bas^0 x0×bas0)。
想要有限种解,必须至少满足00:10这样的时间,这样的时间在59进制下是00:59,是一个上界。
因此在代码实现时可以先判断60进制下是否合法?若是则有无数种解。否则遍历每种进制,判断是否合法即可。

bool check(string time,int base){
	int hours = 0, minutes = 0;
	bool f=0;
	for (int i = 0; i < (int)time.size(); i++) {
		if (time[i] == ':'){
			f=1;continue;
		}
		int digit = isdigit(time[i])?time[i]-'0':time[i]-'A'+10;
		if (digit >= base) return false; // 如果出现了大于等于base的数字,则时间不合法
		if(!f)hours = hours * base + digit;
		else minutes = minutes * base + digit;
	}
	// 如果时间合法,返回true,否则返回false
	return hours <= 23 && minutes <= 59;
}

小豚鼠排排坐:

小艺酱买了一个由一排排格子组成的小房子n*m,她想让k个小豚鼠每个小豚鼠都有自己的格子。但是为了不浪费空间,她想要最边角的一圈2*(n+m-2)每行每列的格子都有一个小豚鼠居住。
具体来说,假设这k只小豚鼠的格子坐标为(x1, y1), (x2, y2),…,(xk, yk),则需要满足存在1<a,b,c,d<=k,使得xa =1, xb = n, yc = 1, yd = m (a, b, c, d可以重复).
小艺酱想知道自己有多少种方案安排小豚鼠。

注意数据范围很小n<=5,m<=5可以直接暴力dfs每种安排方式,在安排结束后检查是否满足条件即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值