Link
Solution
显然, 所以问题就是在这些数字中选出尽量多的数使得和为的倍数,在最多的情况下字典序最大。 我又想DP了,233...似乎跟Bird的思维过程惊人相似。。好吧 因为对于任何数字,有,所以肯定至少可以取到个。而且这样肯定也是最优的。 剩下的数字排个序就是答案要求的数了。。 然后询问在前缀和里面二分就好了(然而这个二分我还费了好大的劲才转过弯来。。)
Tips
std::partial_sum的等价代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15template <class InputIterator, class OutputIterator>
OutputIterator partial_sum (InputIterator first, InputIterator last,
OutputIterator result)
{
if (first!=last) {
typename iterator_traits<InputIterator>::value_type val = *first;
*result = val;
while (++first!=last) {
val = val + *first; // or: val = binary_op(val,*first)
*++result = val;
}
++result;
}
return result;
}
没错,中间值是用输入数据的类型计算的!!不要问我怎么知道的!!
Code
1 | //Code by Lucida |