枚举

枚举(打表):

题目

有N根柱子排成一排,编号为1到N,现在XY站在第S根柱子上,出口在第T跟柱子上。每次XY可以走到相邻的柱子上,也可以使用超能力跳到第一根柱子或者第N根柱子上,如果离开了柱子之后再也不能到达这里。为了节省能量,XY想用最少次数超能力通关。(无法通过就输出-1)

输入样例

4 1 4

4 1 3

输出样例

0

1

这题你怎么想?你会怎样下手?

无解的情况只有起点和终点位置一样且N不为1。终点和起点都在边界上答案为0,如果起点在边界上或者起点终点相邻答案为1,其他答案为2。
View Code

题目:

有一种奇怪的数,这是一种所有数字是不同的一个整数,名字叫美丽数(例如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]);
    }
}
View Code
posted @ 2017-06-17 19:03  codeg  阅读(250)  评论(0编辑  收藏  举报