陶陶摘苹果:
【题目来源】
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每种安排方式,在安排结束后检查是否满足条件即可。