[ZJOI2009]函数 题解

[ZJOI2009]函数 题解

题目地址:洛谷:【P2591】[ZJOI2009]函数 – 洛谷、BZOJ:Problem 1432. — [ZJOI2009]Function

题目描述

有n 个连续函数fi (x),其中1 ≤ i ≤ n。对于任何两个函数fi (x) 和fj (x),(i != j),恰好存在一个x 使得fi (x) = fj (x),并且存在无穷多的x 使得fi (x) < fj (x)。对于任何i; j; k,满足1 ≤ i < j < k ≤ n,则不存在x 使得fi (x) = fj (x) = fk (x)。
1(8) - [ZJOI2009]函数 题解
如上左图就是3 个满足条件的函数,最左边从下往上依次为f1; f2; f3。右图中红色部分是这整个函数图像的最低层,我们称它为第一层。同理绿色部分称为第二层,蓝色部分称为第三层。注意到,右图中第一层左边一段属于f1,中间属于f2,最后属于f3。而第二层左边属于f2,接下来一段属于f1,再接下来一段属于f3,最后属于f2。因此,我们称第一层分为了三段,第二层分为了四段。同理第三层只分为了两段。求满足前面条件的n 个函数,第k 层最少能由多少段组成。

输入输出格式

输入格式:
一行两个整数n; k。

输出格式:
一行一个整数,表示n 个函数第k 层最少能由多少段组成。

输入输出样例

输入样例#1:

1 1

输出样例#1:

1

说明

对于100% 的数据满足1 ≤ k ≤ n ≤ 100。

题解

参考资料:BZOJ 1432: [ZJOI2009]Function【找规律 – CSDN博客【找规律】【ZJOI2009】函数 – CSDN博客
一开始完全没思路,然后找了一下博客一看,stm找规律。
规律见代码,图示见参考资料。

代码

// Code by KSkun, 2018/6
#include <cstdio>
#include <cctype>

#include <algorithm>

typedef long long LL;

inline char fgc() {
    static char buf[100000], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}

inline LL readint() {
    register LL res = 0, neg = 1;
    register char c = fgc();
    while(!isdigit(c)) {
        if(c == '-') neg = -1;
        c = fgc();
    }
    while(isdigit(c)) {
        res = (res << 1) + (res << 3) + c - '0';
        c = fgc();
    }
    return res * neg;
}

int n, k;

int main() {
    n = readint(); k = readint();
    printf("%d", n == 1 ? 1 : (std::min(k, n - k + 1) << 1));
    return 0;
}


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据