枚举
枚举(打表):
题目
有N根柱子排成一排,编号为1到N,现在XY站在第S根柱子上,出口在第T跟柱子上。每次XY可以走到相邻的柱子上,也可以使用超能力跳到第一根柱子或者第N根柱子上,如果离开了柱子之后再也不能到达这里。为了节省能量,XY想用最少次数超能力通关。(无法通过就输出-1)
输入样例
4 1 4
4 1 3
输出样例
0
1
这题你怎么想?你会怎样下手?
无解的情况只有起点和终点位置一样且N不为1。终点和起点都在边界上答案为0,如果起点在边界上或者起点终点相邻答案为1,其他答案为2。
题目:
有一种奇怪的数,这是一种所有数字是不同的一个整数,名字叫美丽数(例如12345 是美丽数, 11 不是美丽数 ,100 也不是美丽数)。你能算一算在某一区间[a,b]范围内有多少个美丽数吗?
输入范例
2
1 10
1 1000
输出范例
10
738
/*首先可以枚举1到100000的每一个数字是否是美丽的数字,只需要将每一位数字提取出来之后判断是否用过即可。 再预处理出每一个前缀中有多少美丽的数字。 比如可以用f[i]表示小于等于i的所有数字中有多少美丽的数字。之后对于每组数据答案就是f[b] - f[a - 1]。*/ #include <cstdio> #include <algorithm> using namespace std; int x, y, b[100], a[110000]; bool calc(int x) { int len = 0; while (x) { b[++len] = x % 10; x /= 10; } sort(b + 1, b + len + 1); for (int i = 1; i < len; i++) if (b[i] == b[i + 1]) return false; return true; } int main() { for (int i = 1; i <= 100000; i++) a[i] = a[i - 1] + calc(i); while ((scanf("%d%d", &x, &y))!=EOF) { printf("%d\n", a[y] - a[x - 1]); } }