题解:P11181 [ROIR 2018 Day2] 书页
题解:
显而易见的贪心:
(1) 构造出的最后一张文本页作为这本书的最后一页。
(2) 使文本页尽可能多的同时让总页数尽可能少。
第 (1) 点很容易保证,因此我们主要考虑第 (2) 点该如何实现。
为了让文本页尽可能多,我们就应该保证文本页的页码都尽可能小,可以发现与此同时我们已经在让总页数尽可能少了(因为由 (1) 可得总页数取决于最后一张文本页的页码)。
我们一步一步解决这个问题:
(一)
我们不难想到,我们应当令第一张文本页的页码为
(二)
这时我们只能让之前安排好的每一张文本页的页码都加上一,从而使我们的方案的文本页页码和增加,直到尽可能接近但不超过所给定的
(三)
我们可以只让其中一部分(从最后一张依次向前找)的文本页的页码加上一,刚好补足剩下的页码和之差,这下就万无一失了,我们完成了本题贪心的构造。
最后计算我们构造对答案的贡献:
首先令
随后,(一)的贡献显然为
而(二)的贡献在于每一次使全部的文本页页码加一都使得必须在第一张文本页前插入一张插图页才能让文本页的页码成立,我们记录下我们安排的文本页的张数
对于(三)的贡献,我们知道当
这里我们就已经完成了对整道题的分析,写代码就可以了。
另外,我这里使用比较好写的枚举,会不会超时呢?我们这里发现,我们枚举的页码是一个等差数列,我们知道等差数列的和是一个二次多项式,因此枚举的时间复杂度就是
AC Code :
#include<bits/stdc++.h>
using namespace std;
long long k, s, cnt;
int main() {
cin >> k >> s;
for (long long i = k + 1; s - i >= 0; ++i, ++cnt) {
s -= i;
}
cout << bool(s % cnt) + k + s / cnt;
return 0;
}